Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用枚举依赖项设计类的最佳方法_Java_Oop_Class_Object_Enums - Fatal编程技术网

Java 使用枚举依赖项设计类的最佳方法

Java 使用枚举依赖项设计类的最佳方法,java,oop,class,object,enums,Java,Oop,Class,Object,Enums,设计此类课程的最佳方式是什么。 Flag类是一个简单的枚举 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.

设计此类课程的最佳方式是什么。
Flag类是一个简单的枚举

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() { ... };
}
我在这种方法中看到的缺陷是,如果我添加一个新标志,我还必须在示例类中创建一个新的IsX方法,这违反了开-关原则

方法2: 或者在示例类中避免使用所有isX方法,在客户端中只需使用以下方法:

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

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

为什么不执行以下操作:

public boolean isFlagged(Flag flag) {
    return flags.contains(flag);
}
那么您的if-s将如下所示:

if(ex.isFlagged(Flag.Valid))

我不想让
示例
类负责确定它是否有效。您不能将这些验证包装在一个成熟的验证器中,并在那里封装验证逻辑吗?添加标志不会影响任何其他类,但会影响验证器本身。毕竟有些代码必须更改,最好是放在一个地方。
public boolean isFlagged(Flag flag) {
    return flags.contains(flag);
}
if(ex.isFlagged(Flag.Valid))