从LinkedList的构造函数中调用非final的addAll方法

时间:2013-10-09 06:40:18

标签: java openjdk

我一直在阅读Joshua Bloch的Effective Java,它明确指出不应该在构造函数中调用非final方法,我理解为什么调用它们可能是个问题。

我很惊讶在读取openjdk代码时看到,在LinkedList的“复制构造函数”中,调用了非final方法addAll(继承自AbstractCollection)。

如果Java编写者自己这样做,那么必须存在 安全的情况。什么时候安全?如果我定义另一个集合类,我是否允许在构造函数中调用addAll?

1 个答案:

答案 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);
  }
}