Я бы преобразовал все величины в общую единицу за кулисами, а затем преобразовал бы их обратно по мере необходимости. Скажем, в классе Volume:
public class Volume {
private double gallons;
private Volume(double gallons) {
if (gallons < 0) {
throw new IllegalArgumentException("value must be positive");
}
this.gallons = gallons;
}
public static Volume ofGallons(double gallons) {
return new Volume(gallons);
}
public static Volume ofQuarts(double quarts) {
return new Volume(quarts / 4);
}
public static Volume ofPints(double pints) {
return new Volume(pints / 8);
}
public static Volume ofLiters(double liters) {
return new Volume(0.264172 * liters);
}
public double asGallons() {
return gallons;
}
public double asQuarts() {
return gallons * 4;
}
public double asPints() {
return gallons * 8;
}
public double asLiters() {
return gallons / 0.264172;
}
@Override
public String toString() {
return gallons + " gallon" + (gallons == 1 ? "" : "s");
}
}
Затем, чтобы преобразовать объем, скажем, из пинты в кварты:
quarts = Volume.ofPints(pints).asQuarts();