我想为自己构建一个小API,以便在Java中进行单位转换更容易,因为我找不到任何好的工具。所以我想问一下,如果你认为我的方法是好的。顺便说一句,我不是很擅长Java。
+--converter
| +--types
| | +--Length.java
| | +--UnitType.java
| +--units
| | +--length
| | | +--Feet.java
| | | +--Meter.java
| | +--Unit.java
| +--Converter.java
public class Converter<T extends UnitType> {
private MathContext mc;
private Unit<T> from;
private Unit<T> to;
public Converter() {
mc = new MathContext(1000, RoundingMode.HALF_UP);
}
public Converter<T> from(Unit<T> from) {
this.from = from;
return this;
}
public Converter<T> to(Unit<T> to) {
this.to = to;
return this;
}
public BigDecimal calc() {
return from.getValue().multiply(from.getRate(to.getName()), mc);
}
}
public class UnitType {
private String name;
protected UnitType(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Length extends UnitType {
public Length() {
super("Length");
}
}
public abstract class Unit<T extends UnitType> {
private HashMap<String , BigDecimal> convertRates;
private BigDecimal value;
private String name;
protected Unit(BigDecimal value, String name) {
this.name = name;
this.value = value;
convertRates = new HashMap<String, BigDecimal>();
}
public abstract void setRates(HashMap<String , BigDecimal> rates);
public BigDecimal getRate(String key) {
return convertRates.get(key);
}
public BigDecimal getValue() {
return value;
}
public HashMap<String , BigDecimal> getMapRates() {
return convertRates;
}
public void setMapRates(HashMap<String , BigDecimal> convertRates) {
this.convertRates = convertRates;
}
public String getName() {
return name;
}
}
public class Meter extends Unit<Length> {
public Meter() {
super(new BigDecimal(0), "Meter");
}
public Meter(BigDecimal value) {
super(value, "Meter");
initRates();
}
public Meter(String value) {
super(new BigDecimal(value), "Meter");
initRates();
}
private void initRates() {
HashMap<String, BigDecimal> convertRates = new HashMap<String, BigDecimal>();
convertRates.put("Meter", new BigDecimal("1"));
convertRates.put("Feet", new BigDecimal("3.280839895"));
convertRates.put("Inch", new BigDecimal("39.3700787402"));
this.setRates(convertRates);
}
@Override
public void setRates(HashMap<String , BigDecimal> rates) {
setMapRates(rates);
}
}
BigDecimal test = new Converter<Length>().from(new Meter("45.65"))
.to(new Feet())
.calc();
System.out.println(test);
Output: 149.77034120675
因此它工作正常,但我不确定这是否是一个很好的Java方法,因为我必须为每个单元类别单独添加所有速率。
提前致谢。