创建自定义大十进制类型

2022-09-03 04:58:06

在我的应用程序中,所有大十进制数都缩放为具有两个小数位。换句话说,每次我在代码中创建新的 BigDecimal 时,我都需要使用 scale 方法:

BigDecimal x = BigDecimal.ZERO;
x.setScale(2, RoundingMode.HALF_UP);

因此,为了最大限度地减少工作量,我想创建自定义的BigDecimal类型,如下所示:

public class CustomBigDecimal extends BigDecimal {

    public CustomBigDecimal(String val) {
        super(val);
        this.setScale(2, RoundingMode.HALF_UP);
    }

}

我知道没有做这份工作,但我找不到办法去做,这可能吗?this.setScale(2, RoundingMode.HALF_UP);


答案 1

您可以简单地为自己创建一个方法,该方法创建一个零的BigDecimal。像这样:

public static BigDecimal scaled(String val) {
    BigDecimal x = new BigDecimal(val);
    return x.setScale(2, RoundingMode.HALF_UP);
}

把它放在一个帮助器类中,比如BigDecimalHelper,BigDecimalFactory或其他什么。:)

编辑:稍微更改了它以返回setScale的结果,因为BigDecimal是不可变的。并进一步回答原始问题:不,您编写的内容是不可能的,因为对象的状态不会使用setScale()进行更改。


答案 2

您可以创建一个从 扩展而来的。但是,由于是不可变的,因此您永远不会从父类继承状态(如缩放和舍入模式)。CustomBigDecimalBigDecimalBigDecimal

我会选择另一个答案中建议的实用程序类,或者可能是一个将每个操作委托给实际实例的包装器。这种方法的缺点是,您的全新不会是 ,因此它们不可互换。BigDecimalCustomBigDecimalBigDecimal

编辑:这种方法的缺点是您必须委派大约50种方法。不是世界末日与一个好的IDE,但绝对不是很吸引人...

毕竟,如果您仍然想从 继承,则需要使用装饰器方法:CustomBigDecimalBigDecimal

public class CustomBigDecimal extends BigDecimal {

    private final BigDecimal value;

    private CustomBigDecimal(BigDecimal value) {
        super(value.toPlainString()); // needed to compile, 
                                      // useless except for implicit null-check
        this.value = value;
    }

    public CustomBigDecimal(String val) {
        this(new BigDecimal(val).setScale(2, RoundingMode.HALF_UP));
    }

    @Override
    public CustomBigDecimal abs() {
        return new CustomBigDecimal(this.value.abs());
    }

    // TODO all other methods

}

推荐