2009-03-02 5 views
4

私は、コレクションを篩い分けするために使用されるPredicateというインターフェースを使用しています。例えば、私はJava:シングルトンとジェネリックスを使用したデザイン

私の質問はこれであるなど、

public class BlackCatPredicate implements Predicate<Cat> { 
    public boolean evaluate(Cat c) { 
     return c.isBlack(); 
    } 
} 

を定義し、猫のコレクションに述語を適用するには、いくつかのユーティリティにfindAll(Collection<T> coll, Predicate<T> pred)メソッドを使用して、ちょうど黒のものを得ることができます:私は」私のコード全体に黒い猫がいるので、BlackCatPredicateを繰り返し何度もインスタンス化する必要はありません。それはちょうど1つのインスタンスを持つべきです。 (シングルトン?)しかし、多くの述語を書く過程で、私はそれぞれをシングルトンとして実装する必要はありません。だから、ここで適切なデザインは何ですか?

答えて

12

は、私は一定の匿名クラスを使用すると思いますし、それが動作し、クラスでそれを置く:述語にパラメータがある

public class Cat{ 
    public static final Predicate<Cat> BLACK_PREDICATE = new Predicate<Cat>(){ 
      public boolean evaluate(Cat c) { 
       return c.isBlack(); 
      } 
     }; 

    // Rest of the Cat class goes here 
} 

場合は、することができます静的ファクトリメソッドを使用します。

編集:としては、使用パターンに応じて、コメント欄で指摘された、それは別のクラスに述語定数(及び/又はファクトリメソッド)を収集するために明確コードをもたらすことができる、いずれかのみ猫用、またはそれらのすべて。これは主に番号に依存し、追加の組織がどれだけ役立つかによって異なります。

+0

私はおそらくCat自身ではなく、クラス "Cats"に入れます。 –

1

任意の述語を型argとして取るジェネリックファクトリを作成してから、与えられた述語型に対して単一のインスタンスを生成することができます。

さらに一般的なアプローチは、依存性注入ライブラリを使用して開始し、それを通してすべてのオブジェクト作成を行うことです。通常、タイプを少し変更してシングルトンに切り替えることができます(必要に応じて)。

3

このような何か作業をする必要があります:

class Predicates 
{ 
    private static class BlackCatPredicate implements Predicate<Cat> 
    { 
     public boolean evaluate(final Cat c) 
     { 
      return c.isBlack(); 
     } 
    } 

    private static final BlackCatPredicate = new BlackCatPredicate(); 


    public static Predicate<Cat> getBlackCatPredicate() 
    { 
     return (blackCatPredicate); 
    } 
} 
+0

getBlackCatPredicate述語、またはBlackCatPredicateの戻り値の型?どちらがよかった? – extraneon

+0

おっと...私は述語を返します。 – TofuBeer

0

余分なBlackCatPredicateインスタンスを作成する心配はありません。

new BlackCatPredicate()と書いてほしくない場合は、静的ファクトリメソッドを追加して、BlackCatPredicate.getInstance()と書くことができます。さらに別のオプションは、別のクラスを作成することで、CatPredicates.getBlackCatPredicateInstance()と書くことができます。

ただし、これはクライアントコードから述語の作成を抽象化するためのものですが、実際のオブジェクト作成とは関係ありません。短命のオブジェクトを扱うことは、JVMが最もよく行うことの1つです。したがって、余分なBlackCatPredicateインスタンスを作成してすぐに破棄しても、パフォーマンスはわずかに低下しません。