4

コレクションを選別するために使用される Predicate というインターフェイスを使用しています。たとえば、次のように定義できます

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

次に、いくつかのユーティリティfindAll( Collection<T> coll, Predicate<T> pred)メソッドを使用して述語を猫のコレクションに適用し、黒いものだけを取得します。

私の質問は次のとおりです。コード全体で黒猫を見つけているので、BlackCatPredicate を何度もインスタンス化し続ける必要はありません。インスタンスは 1 つだけである必要があります。(シングルトン?) しかし、多くの述語を書く過程で、それぞれをシングルトンとして実装する必要はありません。では、ここでの適切な設計は何ですか?

4

4 に答える 4

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
}

述語にパラメータがある場合は、静的ファクトリ メソッドを使用できます。

編集: コメントで指摘されているように、使用パターンによっては、述語定数 (および/またはファクトリ メソッド) を別のクラス (Cat のみ、またはすべて) に収集するコードがより明確になる場合があります。それは主にその数、追加の組織がどれだけ役立つかによって異なります。

于 2009-03-02T20:23:06.367 に答える
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);
    }
}
于 2009-03-02T20:21:04.577 に答える
1

述語を型引数として取り、特定の述語型の単一のインスタンスを生成する汎用ファクトリを作成できます。

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

于 2009-03-02T20:18:10.577 に答える
0

BlackCatPredicate余分なインスタンスを作成することについてはまったく心配しません。

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

ただし、これはクライアント コードから述語の作成を抽象化するためのものであり、実際のオブジェクトの作成とは関係ありません。存続期間の短いオブジェクトの処理は、JVM が最も得意とすることの 1 つであるため、余分なBlackCatPredicateインスタンスを作成してすぐに破棄しても、パフォーマンスにはまったく影響しません。

于 2009-03-02T20:46:16.937 に答える