public class UnitConverter4 {
  
    private Unit unit;

    public UnitConverter4(Unit unit) {
	this.unit = unit;
    }

    public double toMeter(double amount) {
	return amount / unit.getFactor();
    }

    public double fromMeter(double amount) {
	return amount * unit.getFactor();
    }

    public static void main(String[] args) {

	java.util.Scanner in = new java.util.Scanner(System.in);

	System.out.print("Enter unit to convert from: ");
	Unit fromUnit = Unit.parseUnit(in.next());

	System.out.print("Enter unit to convert to:   ");
	Unit toUnit = Unit.parseUnit(in.next());

	System.out.print("Enter value in " + fromUnit.getLongName() + ": ");
	double amount1 = in.nextDouble();

	UnitConverter4 convert1 = new UnitConverter4(fromUnit);
	UnitConverter4 convert2 = new UnitConverter4(toUnit);

	double amount2 = convert1.toMeter(convert2.fromMeter(amount1));

	System.out.print("\n" + amount1 + " " + fromUnit.getLongName() + " ");
	System.out.print("equals ");
	System.out.println(amount2 + " " + toUnit.getLongName());
    }
}

class Unit {
    private double factor;
    private String name;
    private String longName;
    
    private Unit(double factor, String name, String longName) {
	this.factor   = factor;
	this.name     = name;
	this.longName = longName;
    }
    
    public double getFactor() {
	return factor;
    }

    public String getName() {
	return name;
    }

    public String getLongName() {
	return longName;
    }
    
    public static final Unit MM = new Unit(1000.0,         "mm", "millimeters");
    public static final Unit CM = new Unit(100.0,          "cm", "centimeters");
    public static final Unit KM = new Unit(0.001,          "km", "kilometers");
    public static final Unit M  = new Unit(1.0,            "m",  "meters");
    public static final Unit FT = new Unit(3.2808399,      "ft", "feet");
    public static final Unit IN = new Unit(39.3700787,     "in", "inches");
    public static final Unit MI = new Unit(0.000621371192, "mi", "miles");

    public static Unit parseUnit(String s) {
	if (s.equalsIgnoreCase("mm"))
	    return MM;
	else if (s.equalsIgnoreCase("cm"))
	    return CM;
	else if (s.equalsIgnoreCase("km"))
	    return KM;
	else if (s.equalsIgnoreCase("m"))
	    return M;
	else if (s.equalsIgnoreCase("ft"))
	    return FT;
	else if (s.equalsIgnoreCase("in"))
	    return IN;
	else if (s.equalsIgnoreCase("mi"))
	    return MI;
	else
	    throw new RuntimeException();
    }
}
