控制方法执行的流程

时间:2015-06-17 09:22:28

标签: java

我有一个超级抽象类,由几个方法组成。这些方法应该按顺序执行。我想让方法被覆盖,但不要改变方法执行的顺序。此外,需要分析每种方法的返回类型以执行下一种方法。每种方法的返回值的类型可以改变。因此,应该允许返回对象的分析在子类中进行。

public abstract class TaskManageer {

    public abstract <A> A init();

    public abstract <B> B start();

    public abstract <C> C shutDown();

    public final boolean  runManager(){

       init();
       start();
       shutDown();

    }
}

方法runManager()已被设为'final',因此子类无法更改顺序。但是,init()方法的输出需要在start()方法之前进行分析。此外,需要输出start()方法来开始shutDown()方法。

应允许对子类进行此分析。

任何人都让我知道如何实现这一目标。

2 个答案:

答案 0 :(得分:2)

由于您的分析应基于您的方法返回的类型,因此您需要在类上定义类型。

public abstract class TaskManager<A, B, C> {

    public abstract A init();

    public abstract B start();

    public abstract C shutDown();

    public abstract void analyzeAfterInit(A initResult);

    public abstract void analyzeAfterStart(B startResult);

    public final booelan  runManager(){

       A initResult = init();
       analyzeAfterInit(initResult);
       B startResult = start();
       analyzeAfterStart(startResult);
       shutDown();

    }
}

*增加: 如果您对通用参数的类型有特定要求,可以使用bounded type parameters,例如TaskManager<A, B, C extends Number>

可能的子类可能如下所示:

public class MyTaskManager extends TaskManager<String, Process, Integer> {

    // private fields ....

    public String init() {
        return "echo 'Hello'";
    }

    public Process start() {
        Process p = new Process(this.command);
        p.start();
        return p;
    }

    public Integer shutDown() {
        int exitCode = this.process.stop();
        return exitCode;
    }

    public void analyzeAfterInit(String initResult) {
        this.command = initResult;
        verifyCommand(initResult);
    }

    public void analyzeAfterStart(Process startResult) {
        this.process = startResult;
    }
}

答案 1 :(得分:2)

我会将先前方法的结果作为参数传递。然后,下一个方法可以使用它。

由于您要确保方法的正确顺序,还要确保无法从外部调用继承的方法,因此将可见性更改为protected而不是public

public abstract class TaskManageer <A, B, C> {

    protected abstract A init();

    protected abstract B start(A a);

    protected abstract C shutDown(B b);

    public final boolean runManager(){
       A a = init();
       B b = start(a);
       C c = shutDown(b);
       return c.getResult();
    }
}