前提是我们有以下课程:
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,忘记它?提前谢谢。
答案 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()
方法,并且您知道他们不能跳过或覆盖您,因为它是构造函数,并且您不需要任何注释。