Java-强制子类在构造函数之后调用超级方法

Str*_*nst 1 java inheritance constructor

我希望一堆子类在完成如下构造函数后调用一个超级方法:

public abstract class Superclass {

    ...

    public Superclass(...) {
        ...    // do stuff before initializing subclass
    }

    protected void dispatch() {     //method to be called directly after creating an object
        doStuff();
        ...
    }

    public abstract void doStuff();
}

public class Subclass extends Superclass {

    ...

    public Subclass(...) {
        super(...);     //has to be the first line
        ...             //assign variables etc.
        dispatch();     //has to be called after variables are assigned etc.
    }

    public void doStuff() {
        //do stuff with assigned variables etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

dispatch()函数在创建对象后包含一组与对象有关的事情,该事情必须应用于所有子类。我不能将此函数移到超级构造函数中,因为它从需要已分配变量的子类中调用方法。但是由于由于super()必须是子构造函数的第一行,因此在调用超级构造函数之前,我无法设置任何变量。

它现在可以正常工作,但是我发现dispatch()在每个子类的构造函数的末尾调用它是一个不好的概念。有没有更优雅的方式来解决这个问题?还是我应该完全重新考虑我的概念?

Tim*_*kle 5

您的请求违反了几种Java最佳实践,例如:

  • 不要在构造函数中进行复杂的配置,仅填充私有(最终)成员变量,并且仅执行非常基本的一致性检查(如果有的话)。

  • 不要从构造函数调用non privatenon final方法,甚至不能间接调用。

因此,我强烈建议您考虑一下类的设计。很有可能您的班级太多且有太多的责任感。


Ste*_*235 0

如果您确实需要在调用方法时完成任何子类实例化,那么 Lorelorerere 是正确的。否则,你可以做你所拥有的。如果其他人需要使用该代码,我建议添加足够的注释。