Java 对抽象方法强制执行公共初始化步骤

Java 对抽象方法强制执行公共初始化步骤,java,oop,inheritance,Java,Oop,Inheritance,我目前正在重构一组可以简化为以下内容的类: public abstract class A { public abstract Output doStuff(Input in); } public class B extends A { public Output doStuff(Input in) { // dostuff and return an output } } 现在,我想在a中添加一个字段,其值是从中的输入中派生出来的,最好不要更改子

我目前正在重构一组可以简化为以下内容的类:

public abstract class A {
    public abstract Output doStuff(Input in);
}

public class B extends A {
    public Output doStuff(Input in) {
        // dostuff and return an output
    }
}
 
现在,我想在
a
中添加一个字段,其值是从
中的
输入中派生出来的,最好不要更改子类中的任何内容(大约有20个类,如
B

基本上,我想找到一种方法,在
doStuff()
的每次调用中调用
init
方法(见下文),而不必在类
a
中实现该方法,也不必在类扩展a中更改内容

你知道有什么优雅的方法吗

public abstract class A {
    private Object property;

    public abstract Output doStuff(Input in);

    private init(Input in){
      property=in.getProperty();   
    }
}

public class B extends A {
    public Output doStuff(Input in) {
        // dostuff and return an output
    }
}

您只需在
a
中编写一个方法,该方法调用
init()
方法和
doStuff()
方法。这样,每个子类都会自动调用
init()
方法

public abstract class A {
    private Object property;

    public Output doStuffWithInit(Input in) {
         this.init(in);
         return this.doStuff(in);
    }

    public abstract Output doStuff(Input in);

    private init(Input in){
      property=in.getProperty();   
    } 
}

必须将消费类更改为调用
dostufwithinit()
,以确保每次调用
init()

为什么您有一个不能更改
a
的限制?我可以更改a,我写道我不希望更改从a继承的类,虽然这更像是一种偏好而非限制,但一个显而易见的解决方案是在a中实现doStuff,这样它就可以调用init并返回任何内容,然后将B类更改为在执行它们的操作之前调用super(in)。但是我发现它很难看,因此问题是如果你不想改变子类,那么现在就用纯面向对象的方法来引入它已经太迟了。你可能想看看像AOP这样的特技。正如我所说的,这更像是一种偏好。如果一个涉及改变子类的解决方案能够证明自己是优雅的,我也很乐意接受它。然而,也有一些消费类,所以我宁愿不这样划分。如果在较新版本的java中没有新的奇特方法,我会选择这种解决方案。感谢您的回答,在接受它之前我将稍等:-)现在这将打破直接在子类类型实例上调用
doStuff()
的现有客户端。