定义谓词和函数的正确方法

vto*_*tor 5 java enums predicate guava

在定义谓词函数时,我曾经将它们创建为static final

private static final Predicate<SomeDto> SOME_PREDICATE =
                new Predicate<SomeDto>() {
                    @Override
                    public boolean apply(SomeDto input) {
                        return input.isValid();
                    }
                }
Run Code Online (Sandbox Code Playgroud)

但是我注意到,enum例如,版本也有很多用途

private enum SomePredicate implements Predicate<SomeDto> {
        INSTANCE;

        @Override
        public boolean apply(SomeDto input) {
            return input.isValid();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我知道枚举与静态最终主题,但是使用枚举对谓词或函数的静态最终是否有任何真正的优势?

Col*_*inD 5

enum在这种情况下,单例方法的主要优点是Predicate/ Function是自动的Serializable.

由于这个原因,Guava本身使用enums来实现它的一些PredicateFunction实现.Josh Bloch建议enum在Effective Java 2nd Ed.第3项中使用单例时使用s .报价:

这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多实例化的铁定保证,即使面对复杂的序列化或反射攻击.虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方法.

Guava在其API中通过静态方法暴露了这些单例,避免了SomePredicate.INSTANCE用户代码中的丑陋.