我遇到过一些以枚举形式编写的状态机示例。例如:
public enum State {
INITIAL {
@Override
public State process(char ch) { return MIDDLE; }
},
MIDDLE {
@Override
public State process(char ch) {
switch (ch) {
case 'a': return INITIAL;
default: return FINAL;
}
}
},
FINAL {
@Override
public State process(char ch) { return FINAL; }
};
public abstract State process(char ch);
public static State initial() { return INITIAL; }
}
我关心的是让常数彼此了解。 它们的实现可能会发生变化,如果添加(或删除)常量,则意味着更多的更改。
但是,所有更改都包含在枚举中,除非外部代码直接引用常量并对转换表做出假设。
那么,这段代码是高度耦合的、松散耦合的,还是主观?
最佳答案
我想说,对于一个灵活的工具来说,这耦合得太紧密了。
更宽松的东西会更灵活:
public enum State {
INITIAL,
MIDDLE,
FINAL;
public static State initial() {
return INITIAL;
}
}
// A 'null' for the Character matches anything.
static Map<Pair<State,Character>, State> machine = new HashMap<>();
static {
// Always transit from INITIAL to MIDDLE
machine.put(new Pair<State,Character>(State.INITIAL,null), State.MIDDLE);
// An 'a' transitrs us to FINAL
machine.put(new Pair<State,Character>(State.MIDDLE,'a'), State.FINAL);
// Anything else takes us back to INITIAL
machine.put(new Pair<State,Character>(State.MIDDLE,null), State.FINAL);
// Stay in FINAL once there.
machine.put(new Pair<State,Character>(State.FINAL,null), State.FINAL);
}
关于java - 枚举中的耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428558/