java - 当子类在构造函数中初始化时,是否应该将字段初始化保留在父类(super class)的声明中?

标签 java

基于 this question 的回答,假设我有一个在声明中初始化了字段的类,当我扩展该类并需要子类具有不同的默认值时应该怎么做?

我应该在子类的构造函数中分配新的默认值并将分配保留在父类(super class)的声明中吗?:

public class Bird {
    private boolean flight = true;
}

public class Penguin extends Bird {
    public Penguin() {
        flight = false;
    }
}

或者我应该重构以便两个类都在构造函数中初始化字段?

来自this question中的答案看起来没有显着的技术差异,所以这是一个关于语义的问题。

最佳答案

首先是两种情况之间的差异。

对于不可变属性(最严格的 - 很好 - 情况):

public class Bird {
    public final boolean flight;

    public Bird() {
        this(true);
    }

    protected Bird(boolean flight) {
        this.flight = flight();
    }
}

public class Penguin extends Bird {
    public Penguin() {
        super(false);
    }
}

为了更自由、动态的使用:

public class Bird {
    protected boolean flight = true;
    public boolean hasFligth() {
        return flight;
    }
}

public class Penguin extends Bird {
    public Penguin() {
        flight = false;
    }
}

但是,flight 可能不被认为是每个单独的 Bird/Penguin 对象的属性:它是类(Penguin、Ostrich,...)的属性。一种策略模式,或者:

Map<Class<Bird>, Boolean>
Set<Class<Bird>> // better

位于另一侧,在航类舱内。

关于java - 当子类在构造函数中初始化时,是否应该将字段初始化保留在父类(super class)的声明中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661492/

相关文章:

java - 如何以 Scanner 方法 "hasNext"作为条件退出 java 中的 while 循环?

java - JLabel 不会更新,除非有什么东西导致方法挂起

java - 无法从 Soap 响应中的节点检索文本内容

java - jsoup 获取 URL 时出错。 Status=503 仅在 Heroku 上

java - 停止线程并运行一些清理代码的最安全/最佳方法是什么

java - 取决于当前记录的主体的验证规则

java - 如何&& if循环表达式求值?

Java:AffineTransform 旋转多边形,然后得到它的点

java - 如何使用 apache cxf 工件在 SOAP 请求中设置用户名和密码

java - 如何使用 c :out 不转义 JSTL 中的字符