3

このクラスを設計する最良の方法は何でしょうか。
フラグ クラスは単純な列挙型です

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)) { ... }

これの欠点は余分なボイラープレート コードですか?

4

1 に答える 1

3

次のようなことをしないのはなぜですか:

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

次に、if-s は次のようになります。

if(ex.isFlagged(Flag.Valid))
于 2013-04-09T14:38:37.687 に答える