0

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

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

如果 Java 编写者自己这样做,那么在某些情况下这样做安全的。什么时候这样做是安全的?如果我定义另一个集合类,我可以在构造函数中调用 addAll 吗?

4

1 回答 1

1

好问题。简单地说,在某些情况下,你可以,只要被覆盖的方法不依赖于子类的初始化。在下面的示例中,输出为 0,因为已经创建了 childvar 变量,但是分配初始值 int childvar=1 的行和 Child 构造函数中的赋值都还没有执行。另一方面,如果您只使用 Parent 环境,则可以。它会导致意想不到的结果,难以调试错误,所以我建议你只在真正节省大量时间的情况下使用它并小心,这很棘手。

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);
  }
}
于 2013-10-09T07:29:02.097 回答