原文链接:https://www.cnblogs.com/xiohao/p/7405423.html

问题

我知道Java枚举会被编译成一个包含私有构造参数和一堆静态方法的类,当去比较两个枚举的时候,总是使用equals()方法,例如:

publicuseEnums(SomeEnum a)

{if(a.equals(SomeEnum.SOME_ENUM_VALUE))

{

...

}

...

}

除此之外,我也可以使用 == 替代equals() 方法

publicuseEnums2(SomeEnum a)

{if(a ==SomeEnum.SOME_ENUM_VALUE)

{

...

}

...

}

我有5年以上的java编程经验,并且我想我也懂得 == 和 equals() 之间的区别,但是我仍然觉得很困惑,哪一个操作符才是我该使用的。

答案

二者皆对,如果你看过枚举的源码,你会发现在源码中,equals也仅仅非常简单的 == 。 我使用 == ,因为无论如何,这个左值是可以为 null的

译者补充 java.lang.Enum 中Equals 代码:

public final booleanequals(Object other) {return this==other;

}

额外答案

能在枚举中使用 == 进行判断?

答案是肯定的,因为枚举有着严格的实例化控制,所以你可以用 == 去做比较符,这个用法,在官方文档中也有明确的说明。

JLS 8.9 Enums 一个枚举类型除了定义的那些枚举常量外没有其他实例了。 试图明确地说明一种枚举类型是会导致编译期异常。在枚举中final clone方法确保枚举常量从不会被克隆,而且序列化机制会确保从不会因为反序列化而创造复制的实例。枚举类型的反射实例化也是被禁止的。总之,以上内容确保了除了定义的枚举常量之外,没有枚举类型实例。

因为每个枚举常量只有一个实例,所以如果在比较两个参考值,至少有一个涉及到枚举常量时,允许使用“==”代替equals()。(equals()方法在枚举类中是一个final方法,在参数和返回结果时,很少调用父类的equals()方法,因此是一种恒等的比较。)

什么时候 == 和 equals 不一样?

As a reminder, it needs to be said that generally, == is NOT a viable alternative to equals. When it is, however (such as with enum), there are two important differences to consider: 通常来说 == 不是一个 equals的一个备选方案,无论如何有2个重要的不同处需要考虑:

== 不会抛出 NullPointerException

enumColor { BLACK, WHITE };

Color nothing= null;if (nothing == Color.BLACK); //runs fine

if (nothing.equals(Color.BLACK)); //throws NullPointerException

== 在编译期检测类型兼容性

enumColor { BLACK, WHITE };enumChiral { LEFT, RIGHT };if (Color.BLACK.equals(Chiral.LEFT)); //compiles fine

if (Color.BLACK == Chiral.LEFT); //DOESN'T COMPILE!!! Incompatible types!

什么时候使用 == ?

Bloch specifically mentions that immutable classes that have proper control over their instances can guarantee to their clients that == is usable. enum is specifically mentioned to exemplify. 具体来说,那些提供恰当实例控制的不可变类能够保证 == 是可用的,枚举刚好符合这个条件。

考虑静态工厂方法代替构造器 它使得不可变的类可以确保不会存在两个相等的实例,即当且仅当a==b的时候才有a.equals(b)为true。如果类保证了这一点,它的客户端可以使用“==”操作符来代替equals(Object)方法,这样可以提升性能。枚举类型保证了这一点

总而言之,在枚举比较上使用 == , 因为: 1. 能正常工作 2. 更快 3. 运行时是安全的 4. 编译期也是安全的

java枚举比较_java枚举enum equal与==相关推荐

  1. java枚举类型转换_java枚举类型enum值与整数的转换

    java编程中偶尔会用到枚举,为了直观,我们通常将枚举值设置为形象的单词,方便理解和使用.枚举类型相当于数据库 中字典表,但是枚举只有字典表的值,缺少其他用来表示和值一一对应的字段,当我们在数据库中保 ...

  2. java 枚举 示例_Java枚举name()方法及示例

    java 枚举 示例 枚举类name()方法 (Enum Class name() method) name() method is available in java.lang package. n ...

  3. java 枚举 大小_Java枚举入门

    枚举类(掌握) 枚举的诞生历史(了解) 在服装行业,衣服的分类根据性别可以表示为三种情况:男装.女装.中性服装. private ? type: public void setType(? type) ...

  4. java 枚举 注解_Java枚举类和注解梳理

    1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  5. java获取枚举索引_Java枚举使用详解

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...

  6. java 枚举 方法_Java枚举使用方法详解

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...

  7. java枚举数字_Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: packagejava上课;public classEnumTest {public static voidmain(String[] args) { ...

  8. java枚举数字_Java 枚举 通过数字实例化枚举类型

    package com.zjl.domain.enumtype; /** * 枚举类 * * @Author zjl * @Date 2018/06/27 */ public enum EnumTyp ...

  9. java枚举 数字_java 枚举

    Java中枚举的线程安全性及序列化问题 --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字 ...

  10. java 枚举父类_Java枚举

    java枚举 枚举类:类的对象只有限个.确定个 特殊的如果只有一个对象,就是单例模式 当需要定义一组常量时,强烈建议使用枚举类 jdk5.0之前 自定义枚举类 jdk5.0之后 enum定义 自定义枚 ...

最新文章

  1. php怎么实现自动售货,PHP自动化售货发卡网源码+教程
  2. jquery 中attr和prop的区别
  3. 忍不住还是装了一下Windows Vista
  4. teamviewer 无法连接 原因未知
  5. c#使用System.Windows.Forms.DataVisualization.Charting.dll绘制图表实例
  6. c++两个vector合并_数据结构——算法初步(4)——合并排序算法
  7. 具体解决VS“滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之间”奇怪问题...
  8. HIVE 1.1.0 启动时报错: Unsupported major.minor version 51.0
  9. Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
  10. Python Imaging Library: ImageTk Module(图像Tkinter模块)
  11. knife4j--api请求参数不一致问题
  12. 03、了解自动配置原理笔记
  13. 怎么实现单点登录?面试必问!
  14. fortran95查询字符串出现次数子程序
  15. 调用QQ/TIM算法实现获取当前登陆账号和ClientKey
  16. canvas绘制图形的相关API
  17. 树莓派控制舵机和步进电机
  18. 美团外卖、饿了么竞品分析
  19. 为什么tumblr起作用
  20. THUSC2018滚粗记

热门文章

  1. vue 数据劫持 响应式原理 Observer Dep Watcher
  2. 20155315 2016-2017-2 实验二《Java面向对象程序设计》实验报告
  3. 邮件服务器拦截与反垃圾邮箱的相关方法
  4. Gridview用法大总结
  5. ExtJs + Struts2 + JSON 程序总结
  6. pymongo基本方法使用笔记
  7. CSDN 编辑器使用指南
  8. ACL'21 | 对比学习论文一句话总结
  9. 如何优雅地编码文本中的位置信息?三种positioanl encoding方法简述
  10. 【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency Parsing