如果你想实现不可变性,就不能有子类。
这几乎是正确的,但并非完全如此。重新陈述一下:
如果你想实现不可变性,你必须确保所有子类都是不可变的。
允许子类化的问题在于通常任何可以创建类的人都可以对任何公共的非 final 类进行子类化。
但是所有子类都必须调用其超类的构造函数。包私有构造函数只能由同一包中的子类调用。
如果你
封装包以便控制哪些类在你的包中,你可以限制子类化。首先定义一个你想要子类化的类:
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;
Employee(Id id, Name name, ...) {
}
}
public final class Accountant extends Employee {
public Accountant(Id id, Name name, ...) {
super(id, name, ...);
}
}
public final class ITWorker extends Employee {
public ITWorker(Id id, Name name, ...) {
super(id, name, ...);
}
}