为什么不可变类提供了mutators?

Inq*_*ive 3 java immutability bigdecimal

请考虑以下代码:

    bdval = new BigDecimal(strval, new MathContext(attrib.getPrecision()));
    bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)

PMD非常正确地说:

对Immutable的无用操作

那么为什么Immutable类像BigDecimal属性的导出mutators呢?

JB *_*zet 8

setScale()不会改变它所调用的BigDecimal.它返回BigDecimal的副本以及新的缩放值.

PMD报告错误,因为您的代码错误:它忽略了操作的结果,使操作无效.你的代码应该是:

bdval = bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)

  • 如果`setScale`是静态的,那么代码将更加冗长`BigDecimal.setScale(bdval,attrib.getScale(),RoundingMode.HALF_UP);`没有真正的好处 - 逻辑仍然存在于BigDecimal类中.并且有一个很好的论据可以说,操纵BigDecimals的逻辑属于BigDecimal类. (5认同)
  • 当然,_naming_可以使用改进 - 我可能已经使用`withScale`而不是`setScale`.但我认为这种方法的位置很好. (3认同)