为什么不可变类提供修改器?

3

考虑以下代码:

    bdval = new BigDecimal(strval, new MathContext(attrib.getPrecision()));
    bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);

PMD提示:

对不可变对象进行了无用的操作

那么,为什么像BigDecimal这样的不可变类会为其属性导出mutators呢?

1个回答

8

setScale() 方法不会改变其所在的 BigDecimal 对象,而是返回一个新的 BigDecimal 副本,其小数位精度为设定值。

PMD 报错是因为你的代码有误,它忽略了该方法的返回值,使得该操作无意义。你应该这样写:

bdval = bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP);

如果我是你,我会说这是设计得很糟糕的 API。它应该是一个静态方法,并且违反了单一职责原则。 - Inquisitive
5
如果setScale是静态的,那么代码会变得更加冗长:BigDecimal.setScale(bdval, attrib.getScale(), RoundingMode.HALF_UP);,而没有实际的好处——逻辑仍然存在于BigDecimal类中。并且可以有一个很好的论点认为操作BigDecimals的逻辑应该属于BigDecimal类。 - matt b
3
可以改进命名方式,也许应该使用withScale而不是setScale。但我认为这个方法的位置很好。 - Louis Wasserman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接