このクラスを設計する最良の方法は何でしょうか。
フラグ クラスは単純な列挙型です
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()) { ... };
このアプローチで見られる欠陥は、新しいフラグを追加すると、例クラスで新しい IsX メソッドも作成する必要があることです。これは、オープン クローズの原則に違反していますか?
アプローチ 2: または、Example クラスとクライアントのすべての isX メソッドを回避します。
Set<Flag> set = ex.getFlags();
if (set.contains(Flag.VALID)) { ... }
これの欠点は余分なボイラープレート コードですか?