如何从抽象类强制执行方法?

时间:2014-11-20 16:57:57

标签: java java-ee

前提是我们有以下课程:

public class B extends A{
    @PostConstruct
    public void setUp(){
        a = new XYZ();
        addListener();
    }    
}

public abstract class A{
    X a;

    public void addListener(){
        a.addChangeListener();
    }
}

在A类的任何实现中,应该提供初始化' a'属性。让我们假设每个X实现都必须覆盖addChangeListener,并且注册侦听器对于A的每个实现都是基本的和必要的。有没有办法让A类后续实现的开发人员能够记住这个' addListener& #39;每次打电话,只是把它放在A,忘记它?提前谢谢。

2 个答案:

答案 0 :(得分:2)

我同意@chrylis,在A上使用@PostConstruct而不是A的每个子类。(注意spec表示只有1种方法可以这种方式注释。

类似的东西:

public interface X {
    void addChangeListener();
}

public abstract class A {
    X a;

    protected abstract X newX();

    protected void setUp() {}

    @PostConstruct
    public void init() {
        a = newX();
        a.addChangeListener();
        setUp();
    }
}

这允许强制构造子类,使实现者不再记住addListener()调用,同时仍然允许它们执行特定于类的初始化。

答案 1 :(得分:1)

我想我采取了不同的方法。使用构造函数强制满足依赖性。除非有 使用@PostConstruct的原因,否则我认为这将满足您的需求。

public class B extends A{
    public B() {
        super(new XYZ());
    }
}

public abstract class A{
    X a;

    public A(X a){
        this.a = a;
        a.addChangeListener();
    }
}

扩展A的程序员将被强制传递a的初始化作为构造函数参数,因此他们不会忘记 - 如果他们不在,那么该类将无法编译这样做。构造函数将始终调用a.addChangeListener()方法,并且您知道他们不能跳过或覆盖您,因为它是构造函数,并且您不需要任何注释。