扩展到BigDecimal的类从超类类型返回对象

时间:2018-10-01 20:37:07

标签: java bigdecimal

我想用钱做一些计算。为了防止舍入错误,我决定使用BigDecimal而不是double或float。现在我认为,这不是一个好主意,因为它使计算极其困难。

我创建了一个名为Euro的类,该类从BigDecimal扩展而来,以覆盖toString和equals方法。

现在,如果我想向欧元对象添加数字,我会像

Euro sum = (new Euro(10)).add(new Euro(15));

这里的问题是add(...)从BigDecimal类返回一个对象,该对象无法转换为欧元,因此我将其添加到Euro类:

public Euro add(Euro euro){
    return new Euro(euro.add((BigDecimal) this).floatValue());
}

现在该怎么办,而不是用Euro重写BigDecimal的所有方法?我想,最好的解决方案是用整数代替美分,因为BigDecimal可以写

int sumCents = 1000 + 1500;

而不是上面的长期

1 个答案:

答案 0 :(得分:0)

在这种情况下,最好使用组合而不是继承。当将BigDecimal子类化为Euro时,就是说Euro 一个BigDecimal。准确地说,Money的数量是BigDecimal(或者通常是一个数量)。它还有一个符号,这里是欧元。

您还可以使用其他实现,例如正如您已经想到的,以分位数存储整数。这提示从BigDecimal继承是不正确的。另外,即使在pow上调用Euro也没有意义。 BigDecimal不是Euro

此外,仅调用BigDecimal(或floatValue)以转换为doubleValue会打败使用Euro的观点-避免浮点表示金额时的舍入错误。

使用合成时,您只能公开所需的方法,例如BigDecimaladd,而不必在每次数学运算期间覆盖方法并创建新的子类对象。作为实现细节,数学运算是对实例变量而不是对整个类进行的。