让我们定义一个简单的状态机:
public enum State {
A, B, C, D;
private List<State> validChange;
static {
A.validChange = Arrays.asList(B);
B.validChange = Arrays.asList(C);
C.validChange = Arrays.asList(A, D);
D.validChange = Arrays.asList(D);
}
public boolean couldChange(State newState) {
return validChange.contains(newState);
}
}
和一个简单的状态对象
public class StateObject {
private State currentState;
public State getCurrentState() {
return currentState;
}
public void setCurrentState(State currentState) {
if (this.currentState != null && !this.currentState.couldChange(currentState)) {
throw new IllegalStateException(String.format("Can not change from %s to %s", this.currentState, currentState));
}
this.currentState = currentState;
}
}
正如我们在 setter 中看到的,我们检查状态更改是否有效。我的问题:
- 向 setter 方法添加一些逻辑是否是一个好的解决方案(我们不感兴趣它是如何工作的,只关心 setter 中的事实逻辑)?
- 我们什么时候应该添加逻辑,什么时候不应该?
- 如果不是为什么?