[英]How to enforce method execution from abstract class?
前提是我们有以下课程:
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”调用,而只需放它以某种方式在A中忘记了吗? 提前致谢。
我同意@chrylis,在A而不是A的每个子类上使用@PostConstruct
。(请注意, 规范说只能以这种方式注释一种方法。
就像是:
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()调用,同时仍允许他们执行特定于类的初始化。
我想我会采取不同的方法。 使用构造函数强制满足依赖性。 除非@PostConstruct
某些原因必须使用@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()
方法,并且您知道它们无法跳过或覆盖您,因为它是构造函数,并且您不需要任何批注。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.