约书亚·布洛赫(Joshua Bloch)提出的建议之一是,应该将类设计为不可变的。

我有以下课程

public class Dividend {
    public Dividend setDate(SimpleDate date) {
        Dividend dividend = new Dividend(this.getStock(), this.getAmount(), date);
        return dividend;
    }
.....// More to go.

对于setDate方法,将不会修改此对象。

而是将返回其日期字段被修改的副本副本。

但是,通过从方法名称判断,用户如何知道该对象仍然保持不变?

除了setDate之外,还有更好的命名约定吗?

最佳答案

如果您有设置器,则您的类将看起来可变,并且用户可能会以错误的方式使用它。他们可能会这样称呼它:

dividend.setDate(myDate);

然后惊讶为什么dividend的日期没有更改。他们应该这样使用它:
newDividend = dividend.setDate(myDate);

为了使API更直观,最好将setDate方法重命名为copyWith:
newDividend = dividend.copyWith(myDate);

或者,如果您有许多字段并且重载会造成混淆,则可以将它们称为copyWithDatecopyWithComment

如其他答案中所述,其他名称也是可能的:derive(和deriveWithDate),或者只是withDate

07-21 20:34