如果要强制不变性,则不能有子类。
这几乎是正确的,但并非完全如此。重申一下:
如果要强制不变性,则必须确保所有子类都是不变的。
允许子类化的问题在于,通常任何可以编写类的人都可以将任何公共非最终类子类化。
但是所有子类都必须调用其超类的构造函数之一。包私有的构造函数只能由同一包中的子类调用。
如果密封包以控制包中的类,则可以约束子类。首先定义您要子类化的类:
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, ...); }}


