java – 不可变的类和子类
我正在尝试学习可变/不可变类,我遇到了
this post
提供的部分答案是:
好吧,我明白了,但是,你将如何处理这个问题.假设您被赋予了创建3个Employee类,Accountant,ITDepartment和QualityAssurance的任务.现在,您可以创建一个名为Employee的抽象类,其中包含所有人共享的常用方法(员工ID,姓名,工资等),您的类不再是不可变的. 使用Java,那你怎么解决这个问题呢?你会创建3个类,使它们成为最终类,并且不实现抽象方法吗? (所以,没有任何子类)或者你会使用一个接口,并只提供getter? 解决方法
这几乎是正确的,但并非完全如此.重申一下:
允许子类化的问题在于,通常任何可以创建类的人都可以子类化任何公共非final类. 但是所有子类都必须调用其超类的构造函数之一.包私有构造函数只能由同一包中的子类调用. 如果您使用seal packages以便控制包中的哪些类,则可以限制子类化.首先定义一个你想要子类的类: 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,...) { super(id,name,...); // Call to super works from same package. } } public final class ITWorker extends Employee { // Ditto. public ITWorker(Id id,...); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Spring Boot中使用swagger-bootstrap-ui的方法
- Java 动态代理详解
- 从Java中的WebService返回ArrayList
- java – JetBrains IntelliJ Idea需要很长时间才能“制造”
- java – 我应该如何诊断和防止JVM崩溃?
- Java Streams – 过滤先前过滤的值
- Play Framework 2.1(Java)eBean @Encrypted Annotation Err
- Java编程swing组件JLabel详解以及使用示例
- java – BIRT JDBCException“无法加载JDBC驱动程序类:com
- java – 如果没有代码:它只是一个智力挑战还是具体有用?