java枚举比较_java枚举enum equal与==
原文链接: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与==相关推荐
- java枚举类型转换_java枚举类型enum值与整数的转换
java编程中偶尔会用到枚举,为了直观,我们通常将枚举值设置为形象的单词,方便理解和使用.枚举类型相当于数据库 中字典表,但是枚举只有字典表的值,缺少其他用来表示和值一一对应的字段,当我们在数据库中保 ...
- java 枚举 示例_Java枚举name()方法及示例
java 枚举 示例 枚举类name()方法 (Enum Class name() method) name() method is available in java.lang package. n ...
- java 枚举 大小_Java枚举入门
枚举类(掌握) 枚举的诞生历史(了解) 在服装行业,衣服的分类根据性别可以表示为三种情况:男装.女装.中性服装. private ? type: public void setType(? type) ...
- java 枚举 注解_Java枚举类和注解梳理
1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...
- java获取枚举索引_Java枚举使用详解
在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...
- java 枚举 方法_Java枚举使用方法详解
在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数 ...
- java枚举数字_Java枚举类型的使用,数值的二进制表示
一.Java枚举类型的使用 首先请看这段代码: packagejava上课;public classEnumTest {public static voidmain(String[] args) { ...
- java枚举数字_Java 枚举 通过数字实例化枚举类型
package com.zjl.domain.enumtype; /** * 枚举类 * * @Author zjl * @Date 2018/06/27 */ public enum EnumTyp ...
- java枚举 数字_java 枚举
Java中枚举的线程安全性及序列化问题 --枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和class一样,只是一个关键字 ...
- java 枚举父类_Java枚举
java枚举 枚举类:类的对象只有限个.确定个 特殊的如果只有一个对象,就是单例模式 当需要定义一组常量时,强烈建议使用枚举类 jdk5.0之前 自定义枚举类 jdk5.0之后 enum定义 自定义枚 ...
最新文章
- php怎么实现自动售货,PHP自动化售货发卡网源码+教程
- jquery 中attr和prop的区别
- 忍不住还是装了一下Windows Vista
- teamviewer 无法连接 原因未知
- c#使用System.Windows.Forms.DataVisualization.Charting.dll绘制图表实例
- c++两个vector合并_数据结构——算法初步(4)——合并排序算法
- 具体解决VS“滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之间”奇怪问题...
- HIVE 1.1.0 启动时报错: Unsupported major.minor version 51.0
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
- Python Imaging Library: ImageTk Module(图像Tkinter模块)
- knife4j--api请求参数不一致问题
- 03、了解自动配置原理笔记
- 怎么实现单点登录?面试必问!
- fortran95查询字符串出现次数子程序
- 调用QQ/TIM算法实现获取当前登陆账号和ClientKey
- canvas绘制图形的相关API
- 树莓派控制舵机和步进电机
- 美团外卖、饿了么竞品分析
- 为什么tumblr起作用
- THUSC2018滚粗记
热门文章
- vue 数据劫持 响应式原理 Observer Dep Watcher
- 20155315 2016-2017-2 实验二《Java面向对象程序设计》实验报告
- 邮件服务器拦截与反垃圾邮箱的相关方法
- Gridview用法大总结
- ExtJs + Struts2 + JSON 程序总结
- pymongo基本方法使用笔记
- CSDN 编辑器使用指南
- ACL'21 | 对比学习论文一句话总结
- 如何优雅地编码文本中的位置信息?三种positioanl encoding方法简述
- 【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency Parsing