我一直在阅读Joshua Bloch的Effective Java,它明确指出不应该在构造函数中调用非final方法,我理解为什么调用它们可能是个问题。
我很惊讶在读取openjdk代码时看到,在LinkedList的“复制构造函数”中,调用了非final方法addAll(继承自AbstractCollection)。
如果Java编写者自己这样做,那么必须存在 安全的情况。什么时候安全?如果我定义另一个集合类,我是否允许在构造函数中调用addAll?
答案 0 :(得分:1)
好问题。简单地说,在某些情况下,只有当重写的方法不依赖于子类的初始化时才可以。在下面的示例中,输出为0,因为已创建了childvar变量,但是分配初始值int childvar = 1的行和子构造函数中的赋值都尚未执行。另一方面,如果您只使用父环境,则可以。它可能导致意外的结果,很难调试错误,所以我建议你只使用它,如果它真的节省了很多时间并小心,这是棘手的。
abstract class Parent {
protected int parentvar = 2;
public Parent() {
invokeMethod();
}
public abstract void invokeMethod();
public static void main(String[] args) {
new Child();
}
}
class Child extends Parent {
protected int childvar = 1;
public Child() {
super();
childvar = 2;
}
public void invokeMethod() {
System.out.println("" + childvar);
}
}