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

问题描述 投票:6回答:1

我还在学习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加到引入的价格中?如果是这样,为什么?或者只是从价格中删除小数位?或者它有其他目的吗?

谢谢!

java
1个回答
4
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.