栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

不可变的类和子类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

不可变的类和子类

如果要强制不变性,则不能有子类。

这几乎是正确的,但并非完全如此。重申一下:

如果要强制不变性,则必须确保所有子类都是不变的。

允许子类化的问题在于,通常任何可以编写类的人都可以将任何公共非最终类子类化。

但是所有子类都必须调用其超类的构造函数之一。包私有的构造函数只能由同一包中的子类调用。

如果密封包以控制包中的类,则可以约束子类。首先定义您要子类化的类:

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, ...);  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号