Java:使用Singletons和泛型设计

Jak*_*ake 4 java generics singleton predicate

我正在使用一个名为Predicate的接口,用于筛选集合.例如,我可以定义

public class BlackCatPredicate implements Predicate<Cat> {
  public boolean evaluate( Cat c ) {
       return c.isBlack();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用一些实用工具findAll( Collection<T> coll, Predicate<T> pred)方法将谓词应用于Cats的集合,并获得黑色的等等.

我的问题是:我在我的代码中找到黑猫,所以没有必要一遍又一遍地实例化BlackCatPredicate.它应该只有一个实例.(单身?)但是,在编写许多谓词的过程中,我不想将每个谓词都作为单例来实现.那么 - 这里的设计是什么?

Mic*_*rdt 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
}
Run Code Online (Sandbox Code Playgroud)

如果谓词具有参数,则可以使用静态工厂方法.

编辑: 正如评论中指出的那样,根据使用模式,它可能会产生更清晰的代码,以便在单独的类中收集谓词常量(和/或工厂方法),或者只为Cat或其他所有类收集谓词常量(和/或工厂方法).这主要取决于他们的数量,有多少额外的组织是有帮助的.