每篇一句
编程直觉很重要,这个是需要慢慢培养的
答案是都可以,并且建议使用==
相信初学者一定很疑惑,枚举本质是一个类,为什么比较还用==
呢?
分析
如果你看过枚举的源码,你会发现在枚举源码中重写了equals方法,equals也仅仅非常简单的 == 。 我使用 == ,因为无论如何,这个左值是可以为 null的
public final boolean equals(Object other) {
return this==other;
}
JLS 8.9 Enums 一个枚举类型除了定义的那些枚举常量外没有其他实例了。 试图明确地说明一种枚举类型是会导致编译期异常。在枚举中final clone方法确保枚举常量从不会被克隆,而且序列化机制会确保从不会因为反序列化而创造复制的实例。枚举类型的反射实例化也是被禁止的。总之,以上内容确保了除了定义的枚举常量之外,没有枚举类型实例。
因为每个枚举常量只有一个实例,所以如果在比较两个参考值,至少有一个涉及到枚举常量时,允许使用“==”代替equals()。(equals()方法在枚举类中是一个final方法,在参数和返回结果时,很少调用父类的equals()方法,因此是一种恒等的比较。)
使用== 的好处
- == 不会抛出 NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
- == 在编译期检测类型兼容性
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
- == 性能会更加优秀,不需要调用多余的方法,当然性能更好
总而言之,使用==来比较枚举有以下优点:
- 能正常工作
- 更快
- 运行时是安全的
- 编译期也是安全的