我知道Java枚举被编译为具有私有构造函数和一堆公共静态成员的类。在比较给定枚举的两个成员时,我总是使用 ,例如.equals()
public useEnums(SomeEnum a)
{
if(a.equals(SomeEnum.SOME_ENUM_VALUE))
{
...
}
...
}
但是,我刚刚遇到了一些使用 equals 运算符而不是 .equals() 的代码:==
public useEnums2(SomeEnum a)
{
if(a == SomeEnum.SOME_ENUM_VALUE)
{
...
}
...
}
我应该使用哪个运算符?
网友回答:
==
enum
是:枚举具有严格的实例控制,允许您用于比较实例。这是语言规范提供的保证(由我强调):==
JLS 8.9 枚举
枚举类型除了由其枚举常量定义的实例外,没有其他实例。
尝试显式实例化枚举类型是一个编译时错误。中的方法确保永远无法克隆常量,序列化机制的特殊处理可确保永远不会因反序列化而创建重复实例。禁止枚举类型的反射实例化。总之,这四件事可确保除了常量定义的实例之外,不存在任何类型的实例。
final clone
Enum
enum
enum
enum
由于每个常量只有一个实例,因此在比较两个对象引用时,如果已知其中至少有一个引用枚举常量,则允许使用
==
运算符代替equals
方法。(中的方法是一个仅调用其参数并返回结果的方法,从而执行标识比较。
enum
equals
Enum
final
super.equals
Josh Bloch 建议,这个保证足够强大,如果你坚持使用单例模式,实现它的最佳方法是使用单元素(参见:Effective Java 2nd Edition,第 3 项:使用私有构造函数或枚举类型强制实施单例属性;以及单例中的线程安全)enum
==
equals
提醒一下,需要说的是,一般来说,不是 的可行替代方案。但是,如果是(例如 ),需要考虑两个重要的区别:==
equals
enum
==
从不投掷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!
==
Bloch 特别提到,对其实例具有适当控制权的不可变类可以向客户端保证可用。 具体提到举例说明。==
enum
第 1 项:考虑静态工厂方法而不是构造函数
[…]它允许不可变类保证不存在两个相等的实例:当且仅当 。如果类做出此保证,则其客户端可以使用运算符而不是方法,这可能会提高性能。枚举类型提供此保证。
a.equals(b)
a==b
==
equals(Object)
总而言之,使用 on 的参数是:==
enum
网友回答:
两者在技术上都是正确的。如果您查看 的源代码,它只是遵从 。.equals()
==
但是,我使用 ,因为这将是空安全的。==
网友回答:
用于比较两个枚举值是有效的,因为每个枚举常量只有一个对象。==
附带说明一下,实际上没有必要使用来编写 null 安全代码,如果你这样写:==
equals()
public useEnums(final SomeEnum a) {
if (SomeEnum.SOME_ENUM_VALUE.equals(a)) {
…
}
…
}
这是一种最佳实践,称为“比较左边的常量”,您绝对应该遵循。
模板简介:该模板名称为【在给定枚举的两个成员时,我应该使用哪个equals 运算符?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。