繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM