Java单位转换器方法

时间:2016-03-27 09:28:40

标签: java converter


我想为自己构建一个小API,以便在Java中进行单位转换更容易,因为我找不到任何好的工具。所以我想问一下,如果你认为我的方法是好的。顺便说一句,我不是很擅长Java。

文件结构:

+--converter
|  +--types
|  |  +--Length.java
|  |  +--UnitType.java
|  +--units
|  |  +--length
|  |  |  +--Feet.java
|  |  |  +--Meter.java
|  |  +--Unit.java
|  +--Converter.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);
    }
}

UnitType.java:

public class UnitType {

    private String name;

    protected UnitType(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Length.java

public class Length extends UnitType {

    public Length() {
        super("Length");
    }
}

Unit.java:

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;
    }
}

对于Exmaple Meter.java:

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方法,因为我必须为每个单元类别单独添加所有速率。

提前致谢。

0 个答案:

没有答案