我想用钱做一些计算。为了防止舍入错误,我决定使用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;
而不是上面的长期
答案 0 :(得分:0)
在这种情况下,最好使用组合而不是继承。当将BigDecimal
子类化为Euro
时,就是说Euro
是一个BigDecimal
。准确地说,Money
的数量是BigDecimal
(或者通常是一个数量)。它还有一个符号,这里是欧元。
您还可以使用其他实现,例如正如您已经想到的,以分位数存储整数。这提示从BigDecimal
继承是不正确的。另外,即使在pow
上调用Euro
也没有意义。 BigDecimal
不是Euro
。
此外,仅调用BigDecimal
(或floatValue
)以转换为doubleValue
会打败使用Euro
的观点-避免浮点表示金额时的舍入错误。
使用合成时,您只能公开所需的方法,例如BigDecimal
和add
,而不必在每次数学运算期间覆盖方法并创建新的子类对象。作为实现细节,数学运算是对实例变量而不是对整个类进行的。