Joshua Bloch给出的建议之一是,类应该被设计为不可变的.
我有以下课程
public class Dividend {
public Dividend setDate(SimpleDate date) {
Dividend dividend = new Dividend(this.getStock(), this.getAmount(), date);
return dividend;
}
.....// More to go.
Run Code Online (Sandbox Code Playgroud)
对于setDate方法,不会修改此对象.
相反,一个克隆副本,这与它的日期字段被修改将被退回.
但是,通过从方法名称判断,用户将如何知道此对象仍将保持不变?
除了setDate之外还有更好的命名约定吗?
jqn*_*qno 10
如果你有setter,你的类看起来会变得可变,用户可能会以错误的方式使用它.他们可能会这样称呼它:
dividend.setDate(myDate);
Run Code Online (Sandbox Code Playgroud)
然后惊讶为什么这个dividend日期没有改变.他们应该像这样使用它:
newDividend = dividend.setDate(myDate);
Run Code Online (Sandbox Code Playgroud)
为了使API更直观,最好将setDate方法重命名为copyWith:
newDividend = dividend.copyWith(myDate);
Run Code Online (Sandbox Code Playgroud)
或者,如果你有很多领域,超载将会引起混乱,你可以打电话给他们copyWithDate,并copyWithComment.
其他名称也是可能的,如其他答案中所述:( derive和deriveWithDate),或简单地说withDate.