java - 枚举中的耦合

标签 java enums decoupling

我遇到过一些以枚举形式编写的状态机示例。例如:

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/

相关文章:

node.js - 在代码中创建 Node.js 枚举以匹配数据库中的值列表

.net - 开始解耦对象的最佳位置

C# 将集合作为接口(interface)集合传递

javax.faces.component.UpdateModelException : javax. el.PropertyNotFoundException:

java - 我应该使用哪个注释 : @IdClass or @EmbeddedId

java - 如何从列表中删除重复项

python - 当规范坚持时如何避免类耦合

java - Spring 数据 : mongodb find query with optional "criterias"

java - 使用枚举设计 Card 类 - 两种不同设计的优点/缺点

java - 如何为数据库及其对应的表和列编写嵌套枚举代码