更改状态

时间:2017-02-23 11:27:42

标签: java state

我有一个这样的课程:

public class Machine {
    enum State {
        STARTED, STOPPED
    }

    private State state;
    private String whyIsItStopped; // only used in STOPPED state

    ...
}

我想知道这样做的正确方法是什么。我有一种更复杂的类,如果我这样做,它似乎是一团糟。

问题来自于我的架构,你能给我一些建议吗?

更新

使用状态模式我带着几乎解决方案到达:

public interface State {

    public String whyIsItStopped();

    public class Started implements State {
        @Override
        public String whyIsItStopped() {
            return null;
        }
    }

    public class Stopped implements State {
        private final String reason;

        public Stopped(String reason) {
            this.reason = reason;
        }

        @Override
        public String whyIsItStopped() {
            return reason;
        }
    }
}

public class Machine {

    private State state = new State.Started();

    public String whyIsItStopped(){
        state.whyIsItStopped();
    }

    // setState etc ...
}

状态模式似乎改变了同一方法的行为,但对于额外的字段/数据来说却很奇怪。

问题在于它并不是真正相同的对象,而且多态无法真正有用。 我必须在获取其内容之前测试机器是否已停止(作为实例的方式)

if (machine.isStopped()){
     println(machine.whyIsItStopped());
}

另一种方法可能是仅在Stopped状态下设置getter

public interface State {

    public class Started implements State {}

    public class Stopped implements State {
        private final String reason;

        public String whyIsItStopped() {
            return reason;
        }
    }
}

并检索邮件:

if (machine.isStopped()){
    println(((State.Stopped)machine.getState()).whyIsItStopped());
}
// Yeah that's not really beautiful

它在建筑物或使用中都很奇怪。

你还有其他解决办法,比实例更好吗?

0 个答案:

没有答案