如果你想强制不变性,你就不能有子类。
这几乎是正确的,但并不完全正确。重申一下:
如果要强制不变性,则必须确保所有子类都是不可变的。
允许子类化的问题在于,通常任何可以编写类的人都可以对任何公共非最终类进行子类化。
但所有子类都必须调用其超类的构造函数之一。包私有构造函数只能由同一包中的子类调用。
If you 密封包装为了控制包中包含哪些类,您可以限制子类化。首先定义一个你想要子类化的类:
public abstract class ImmutableBaseClass {
ImmutableBaseClass(...) {
...
}
}
由于所有子类都必须有权访问超级构造函数,因此您可以确保您定义的包中的所有子类都遵循不可变的规则。
public final class ImmutableConcreteClass extends ImmutableBaseClass {
public ImmutableConcreteClass(...) {
super(...);
}
}
要将其应用到您的示例中,
public abstract class Employee {
private final Id id;
private final Name name;
// Package private constructor in sub-classable class.
Employee(Id id, Name name, ...) {
// Defensively copy as necessary.
}
}
public final class Accountant extends Employee {
// Public constructos allowed in final sub-classes.
public Accountant(Id id, Name name, ...) {
super(id, name, ...); // Call to super works from same package.
}
}
public final class ITWorker extends Employee {
// Ditto.
public ITWorker(Id id, Name name, ...) {
super(id, name, ...);
}
}