在超级构造函数完成之前,是否可以初始化java子类的私有final字段?

And*_*yld 2 java null construction super

我有一对看起来像这样的课程;

public abstract class Class1 {

//...

    public Class1() {
        //...
        function2();
        //...
    }

    protected abstract void function2();

}

public class Class2 implements Class1 {

    private final OnSomethingListener mOnSomethingListener = new OnSomethingListener() {
        @Override
        onSomething() {
            doThatOtherThing();
        }
    }

    protected void function2() {
        //uses mOnSomethingListener
        //however mOnSomethingListener is null when this function is called from super()
        //...
    }

    public Class2() {
        super();
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设监听器是null因为我有效地引用它super()并且它还没有实例化.但是,我想成功,final因为它确实如此.我可以让这个字段(监听器)及时初始化而不将它放在超类中(它不会使用监听器)吗?

Mar*_*nik 5

您的设计是"泄露this问题"的一个实例,并且是Java中的反模式.你永远不应该从构造函数中调用一个可公开覆盖的方法.