基于 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/