考虑以下代码:
bdval = new BigDecimal(strval, new MathContext(attrib.getPrecision()));
bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);
PMD提示:
对不可变对象进行了无用的操作
那么,为什么像BigDecimal
这样的不可变类会为其属性导出mutators呢?
考虑以下代码:
bdval = new BigDecimal(strval, new MathContext(attrib.getPrecision()));
bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);
PMD提示:
对不可变对象进行了无用的操作
那么,为什么像BigDecimal
这样的不可变类会为其属性导出mutators呢?
setScale()
方法不会改变其所在的 BigDecimal 对象,而是返回一个新的 BigDecimal 副本,其小数位精度为设定值。
PMD 报错是因为你的代码有误,它忽略了该方法的返回值,使得该操作无意义。你应该这样写:
bdval = bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);
setScale
是静态的,那么代码会变得更加冗长:BigDecimal.setScale(bdval, attrib.getScale(), RoundingMode.HALF_UP);
,而没有实际的好处——逻辑仍然存在于BigDecimal类中。并且可以有一个很好的论点认为操作BigDecimals的逻辑应该属于BigDecimal类。 - matt bwithScale
而不是setScale
。但我认为这个方法的位置很好。 - Louis Wasserman