繁体   English   中英

从LinkedList的构造函数调用非最终的addAll方法

[英]Calling non-final addAll method from constructor of LinkedList

我一直在阅读Joshua Bloch的Effective Java,它清楚地表明,不应在构造函数内部调用非最终方法,而且我理解为什么调用它们会带来问题。

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

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

好问题。 简而言之,在某些情况下,仅当重写的方法不依赖于子类的初始化时,您才可以使用。 在下面的示例中,输出为0,因为已经创建了childvar变量,但是尚未分配初始值int childvar = 1的行和Child构造函数中的赋值。 另一方面,如果仅使用父级环境,则可以。 它可能导致无法预期的结果,难以调试错误,因此,我建议您仅在确实节省大量时间并且要小心的情况下使用它,这很棘手。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM