约书亚·布洛赫(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);
或者,如果您有许多字段并且重载会造成混淆,则可以将它们称为
copyWithDate
和copyWithComment
。如其他答案中所述,其他名称也是可能的:
derive
(和deriveWithDate
),或者只是withDate
。