在定义Predicate或Function时,我曾将其创建为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有什么真正的优势吗?
答案 0 :(得分:5)
在这种情况下enum
单身方法的主要优点是Predicate
/ Function
自动为Serializable
。
由于这个原因,Guava本身使用enum
用于Predicate
和Function
个实现。当你想在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?阅读了上一个答案,那么您会发现枚举方法的优点是可以轻松迭代枚举的所有可能值。但是,在您的情况下,您只有一个可能的值,因此这不是一个好处。
基于枚举的方法的一个优点是您的班级名称和名称可以选择更漂亮。如果您想打印类的名称,这可能是一个决定性因素。