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

时间:2015-03-20 18:00:16

标签: java enums guava predicate

在定义PredicateFunction时,我曾将其创建为static final

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

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

private enum SomePredicate implements Predicate<SomeDto> {
        INSTANCE;

        @Override
        public boolean apply(SomeDto input) {
            return input.isValid();
        }
    }

我知道enum vs static final主题,但是使用enum比使用谓词或函数的静态final有什么真正的优势吗?

2 个答案:

答案 0 :(得分:5)

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

由于这个原因,Guava本身使用enum用于PredicateFunction个实现。当你想在Effective Java 2nd Ed。Item 3中使用单身时,Josh Bloch建议使用enum s。引用:

  

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

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

答案 1 :(得分:0)

这两种方式都不比另一方更正确。

如果您在What's the advantage of a Java enum versus a class with public static final fields?阅读了上一个答案,那么您会发现枚举方法的优点是可以轻松迭代枚举的所有可能值。但是,在您的情况下,您只有一个可能的值,因此这不是一个好处。

基于枚举的方法的一个优点是您的班级名称和名称可以选择更漂亮。如果您想打印类的名称,这可能是一个决定性因素。