【问题标题】:Coupling in Enumerations枚举中的耦合
【发布时间】:2013-12-06 16:13:58
【问题描述】:

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

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; }
}

我关心的是让常量相互了解。 它们的实现可能会发生变化,如果添加(或删除)常量,则意味着更多的变化。

但是,所有更改都包含在枚举中,除非外部代码直接引用常量并对转换表做出假设。

那么,这段代码是高度耦合、松耦合还是主观?

【问题讨论】:

  • 是的,我可以看到一个单独的类保存状态转换的逻辑,而不是包含在枚举中。
  • @GriffeyDog 枚举可以是私有的,并嵌套在某个代表状态机适当实例的类中。所以,我认为这是做事的简写版本,在任何严肃的代码中都可能不是一个好习惯。

标签: java enums decoupling


【解决方案1】:

我想说这对于一个灵活的工具来说耦合太紧密了。

更宽松的东西会更灵活:

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);

}

【讨论】:

  • 这是次要的,但你为什么决定添加initial()工厂方法?
  • @PaulBellora - 原来是这样,这似乎是个好主意 - 系统的初始状态不需要由机器定义,它可以由状态列表定义。进一步认为这可能是不正确的,但我认为它没有错。
  • 啊,我在 OP 的 sn-p 中错过了它。明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2015-08-08
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多