不可改变的班级设计

Che*_*eng 6 java

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.

其他名称也是可能的,如其他答案中所述:( derivederiveWithDate),或简单地说withDate.