设计这个类的最好方法是什么。
标志类是一个简单的枚举
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);
以下哪一项是更好的做法:
方法1:然后在客户端代码中检查
if (ex.isValid()) { ... };
我在这种方法中看到的缺陷是,如果我添加一个新的 Flag,我还必须在 Example 类中创建一个新的 IsX 方法,这违反了打开关闭原则?
方法 2:或者避免示例类和客户端中的所有 isX 方法,只要有这个:
Set<Flag> set = ex.getFlags();
if (set.contains(Flag.VALID)) { ... }
这中的缺陷是所有额外的样板代码?