【问题标题】:Best way to design class with enum dependency设计具有枚举依赖的类的最佳方法
【发布时间】:2013-04-09 14:00:18
【问题描述】:

设计这个类的最佳方式是什么。
标志类是一个简单的枚举

public enum Flag { ... };

public class Example {
  private final Set<Flag> flags;
  pubilc Example(Set<Flag> flags) {
    this.flags = flags;
  }

 public Set<Flag> getFlags() {
   return ImmutableSet.copyOf(flags);
 }

 public boolean isValid() {
   return flags.contains(Flag.VALID);
 }

 public boolean isRequired() { ... };
}

一些用于创建示例对象的工厂代码。

Set<Flag> flags = EnumSet.allOf(Flag.class);
Example ex = new Example(flags);

以下哪一项是更好的做法:

方法一: 然后在客户端代码中检查

if (ex.isValid()) { ... };

我在这种方法中看到的缺陷是,如果我添加一个新的 Flag,我还必须在 Example 类中创建一个新的 IsX 方法,这违反了打开关闭原则?

方法 2: 或者避免 Example 类和客户端中的所有 isX 方法,只要有这个:

Set<Flag> set = ex.getFlags();
if (set.contains(Flag.VALID)) { ... }

其中的缺陷是所有额外的样板代码?

【问题讨论】:

  • 我会避免让Example 类负责确定它是否有效。您不能将这些验证包装在一个完整的验证器中并在那里封装验证逻辑吗?添加标志不会影响任何其他类,但验证器本身。毕竟有些代码必须更改,最好将其放在一个地方。

标签: java oop class object enums


【解决方案1】:

为什么不做类似的事情:

public boolean isFlagged(Flag flag) {
    return flags.contains(flag);
}

那么你的 if-s 将如下所示:

if(ex.isFlagged(Flag.Valid))

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多