我还在学习Java,而且我一直在读几个网站上的文章。我在Java Code Geeks找到了一篇文章,我对此有疑问。文章解释了开放/封闭原则。本文使用了一个对公司产品应用折扣的方案。代码的第一部分如下:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Discount {
public BigDecimal apply(BigDecimal price) {
BigDecimal percent = new BigDecimal("0.10");
BigDecimal discount = price.multiply(percent);
return price.subtract(discount.setScale(2, RoundingMode.HALF_UP));
}
}
代码的第二部分如下:
import java.math.BigDecimal;
public class DiscountService {
public BigDecimal applyDiscounts(BigDecimal price,Discount discount) {
BigDecimal discountPrice = price.add(BigDecimal.ZERO);
discountPrice = discount.apply(discountPrice);
return discountPrice;
}
}
在Oracle网站上,它表示BigDecimal中的ZERO值为0,标度为零。这是否意味着在price.add(BigDecimal.ZERO)
中我们只是将0加到引入的价格中?如果是这样,为什么?或者只是从价格中删除小数位?或者还有其他目的吗?
谢谢!
答案 0 :(得分:4)
price.add(BigDecimal.ZERO)
用于创建新的BigDecimal
,因为BigDecimal
没有复制构造函数。
至于为什么,这可能是一个防御性的副本,以防传入BigDecimal
实际上是一个"破坏"版本(因为BigDecimal
不是final
),其值可以在事后更改。这在“有效Java”中作为项目深入讨论"在需要时制作防御性副本;"第2版第39项或第3版第50项。