我正在使用一个名为Predicate的接口,用于筛选集合.例如,我可以定义
public class BlackCatPredicate implements Predicate{ public boolean evaluate( Cat c ) { return c.isBlack(); } }
然后使用一些实用工具findAll( Collection
方法将谓词应用于Cats的集合,并获得黑色的等等.
我的问题是:我在我的代码中找到黑猫,所以没有必要一遍又一遍地实例化BlackCatPredicate.它应该只有一个实例.(单身?)但是,在编写许多谓词的过程中,我不想将每个谓词都作为单例来实现.那么 - 这里的设计是什么?
我将使用匿名类常量并将其与其操作的类放在一起:
public class Cat{ public static final PredicateBLACK_PREDICATE = new Predicate (){ public boolean evaluate( Cat c ) { return c.isBlack(); } }; // Rest of the Cat class goes here }
如果谓词具有参数,则可以使用静态工厂方法.
编辑: 正如评论中指出的那样,根据使用模式,它可能会产生更清晰的代码,以便在单独的类中收集谓词常量(和/或工厂方法),或者只为Cat或其他所有类收集谓词常量(和/或工厂方法).这主要取决于他们的数量,有多少额外的组织是有帮助的.