我有一个这样的课程:
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
它在建筑物或使用中都很奇怪。
你还有其他解决办法,比实例更好吗?