首页 > Java > 在给定枚举的两个成员时,我应该使用哪个equals 运算符?

在给定枚举的两个成员时,我应该使用哪个equals 运算符?

上一篇 下一篇

我知道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 cloneEnumenumenumenum

由于每个常量只有一个实例,因此在比较两个对象引用时,如果已知其中至少有一个引用枚举常量,则允许使用 == 运算符代替 equals 方法。(中的方法是一个仅调用其参数并返回结果的方法,从而执行标识比较。enumequalsEnumfinalsuper.equals

Josh Bloch 建议,这个保证足够强大,如果你坚持使用单例模式,实现它的最佳方法是使用单元素(参见:Effective Java 2nd Edition,第 3 项:使用私有构造函数或枚举类型强制实施单例属性;以及单例中的线程安全)enum


和 之间有什么区别?==equals

提醒一下,需要说的是,一般来说,不是 的可行替代方案。但是,如果是(例如 ),需要考虑两个重要的区别:==equalsenum

==从不投掷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】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 171次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-16
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
单页式简历模板 微信素材 企业网站 微信文章 微信图片 html5 自适应 微信模板 响应式 微信公众平台
您可能会喜欢的其他模板