2013-10-09 25 views
0

我一直在阅读Joshua Bloch的Effective Java,它明确指出非final方法不应该在构造函数中调用,我明白为什么调用它们可能会成为问题。从LinkedList的构造函数调用non-final addAll方法

当我阅读openjdk代码并发现在LinkedList的“复制构造函数”中调用了非final方法addAll(从AbstractCollection继承)时,我感到惊讶。

如果Java编写者自己做到这一点,那么肯定会出现这样的情况,其中安全。什么时候安全?如果我定义了另一个集合类,我可以在构造函数中调用addAll吗?

+2

有没有作者提供的理由也为“非最终方法不应该在构造函数中调用”的说法? –

+2

请参阅:http://stackoverflow.com/a/3404369/982149 – Fildor

+0

可能重复[在构造函数中重写的方法调用有什么问题?](http://stackoverflow.com/questions/3404301/whats-wrong-with- overridable-method-calls-in-constructors) –

回答

0

好问题。简而言之,只有在重写的方法不依赖于子类的初始化的情况下,才可以在某些情况下使用。在下面的示例中,输出为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); 
    } 
} 
相关问题