将BigDecimal.ZERO添加到另一个BigDecimal值

Dav*_*vin 6 java

我还在学习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));
    }
}
Run Code Online (Sandbox Code Playgroud)

代码的第二部分如下:

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

在Oracle的网站上,它表示BigDecimal中的ZERO的值为0,标度为零.这是否意味着price.add(BigDecimal.ZERO)我们只是在引入的价格中加0?如果是这样,为什么?或者只是从价格中删除小数位?或者它有其他目的吗?

谢谢!

Pow*_*ord 4

price.add(BigDecimal.ZERO)BigDecimal由于BigDecimal没有复制构造函数,因此被用于创建新的。

至于为什么,这可能是一个防御性副本,以防BigDecimal传入的实际上是一个“破坏”版本(因为BigDecimal不是final),其值可以在事后更改。在《Effective Java》中,“在需要时制作防御性副本”这一条目深入讨论了这一点;第 2 版第 39 项或第 3 版第 50 项。

  • @Powerlord我认为这里的共识是“bigDecimal.add(BigDecimal.ZERO)”毫无意义且令人困惑,没有表达真正的意图。 (3认同)