Java枚举的一些易忽视点

1、==和equals方法

枚举相等比较中,==和equals方法没有任何区别,查看源码你会发现,equals方法的实现就是通过==判断的。

2、compareTo方法

Enum类的compareTo方法比较的其实是枚举的顺序大小,所以先定义的枚举项要“小于”后定义的枚举项。

3、枚举是实现单例的最好的方式

采用双重校验锁实现单例模式

public class Singleton {private volatile static Singleton singleton;private Singleton(){}public static Singleton getSingleton() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}
}

“双重锁校验”方式虽然保证了线程安全,但是无法解决反序列化会破坏单例模式的问题。

采用枚举实现单例

public enum Singleton {INSTANCE;public void whateverMethon() {}
}

枚举可以解决线程安全问题,因此和上面的双重校验锁方式比代码简洁明了。这是因为枚举在反编译后,属性都带有static。static类型的属性会在类加载之后被初始化,当第一个Java类第一次被真正使用时静态资源被初始化,Java类的加载和初始化过程都是线程安全的,因为虚拟机在加载枚举的类时,会使用ClassLoader的loadClass方法,而这个方法使用同步代码保证了线程安全。所以创建一个enum类型时线程安全的。

那为什么说枚举可以解决反序列化会破坏单例模式问题呢?

普通的Java类的反序列化过程中,会通过反射调用类的默认构造函数来初始化对象。所以,即使单例中的构造函数是私有的,也会被反射破坏。由于反序列化后的对象是重新new出来的,所以就破坏了单例模式。而枚举的反序列化并不是通过反射实现的,是通过enmu类中的valueOf方法来根据名字查找对象,所以也就不会发生由于反序列化导致的单例破坏问题了。(每一个枚举项在JVM中都是单例的,因为序列化+反序列化可以破坏单例,所以Java就针对枚举的序列化作出了特殊规定)。

4、接口的返回值中不能使用枚举类型

有A和B两个服务,A提供一个接口给B服务,接口的方法中返回有有个枚举Atype,刚开始这个枚举汇总有2个值enum1和enum2。但是某一天A升级了,返回的枚举中多了enum3,B未升级,在反序列化的过程中使用valueOf方法在枚举类中找enum3,找不到就会抛出IllegalArgumentException异常。

值得注意的是,在代码开发中,可以使用javadoc的@see注解表明这个字符串的取值从哪个枚举中获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL实现主从复制的步骤,包括配置读写分离的方法。—— 慧哥充电桩开源平台

下载源码 【慧哥开源充电桩平台】 https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001.5502 MySQL主从复制是一种常见的数据备份和读写分离策略。下面是实现MySQL主从复制的步骤: 配置主服务器(Master)&#xff1…

【Android】Fragment的静态动态创建以及两种创建方式的生命周期

参考: 33.3-Fragment的创建-静态创建2_哔哩哔哩_bilibili Fragment的创建_从现有代码创建foutran-CSDN博客 【Android】Fragment的基本用法、Fragment和活动间的通信、Fragment的生命周期、动态加载布局的技巧_android fragment-CSDN博客 文章目录 Fragment的静态创…

linux LED代码设计

设计目标&#xff1a; 写RGB LED灭、亮、闪烁等效果&#xff0c;不同颜色也需要设置 #include <iostream> #include <unistd.h> // 对于usleep() #include <fcntl.h> // 对于open(), close() #include <sys/ioctl.h> // 对于ioctl() #include <li…

C++案例四:简易记事本程序

文章目录 程序介绍代码说明包含必要的头文件主函数定义变量定义主循环显示菜单和读取选择处理用户选择程序介绍 编写一个简单的记事本程序,可以帮助用户添加和查看笔记。这个案例可以练习C++中的输入输出、向量(std::vector)、字符串处理(std::string)、以及简单的控制结…

各种复现,保证质量

代码复现&#xff0c;文献复现&#xff0c;模型复现&#xff0c;算法复现&#xff0c;文章复现&#xff0c;创新点等等&#xff0c;python/matlab/c语言/r语言均可&#xff0c;保证高质量完成&#xff0c;可接急单&#xff0c;不成功不收费&#xff01;

前端小知识点——按钮之间出现很小的空隙如何规避

前端小知识点——按钮之间出现很小的空隙如何规避 文章介绍问题再现总结 文章介绍 本文主要介绍页面中两个按钮相邻时会出现一点空隙&#xff0c;导致在后续自定义填充的时候出现换行或其它问题&#xff0c;特此记录。 问题再现 这个图片能看到我们给外面的div设置的是300的宽…

discuz手机版发帖提示“网络出现问题,请稍后再试”

大家好&#xff0c;我是网创有方。今天分享一个discuz发帖报错的问题。 问题描述&#xff1a;discuz手机网页端发帖提示“网络出现问题&#xff0c;请稍后再试”&#xff0c;但是实际上帖子已经发布成功。 本次记录下分析过程&#xff1a; 第一步&#xff1a;打开宝塔&#…

C++:左值/右值引用、移动语义/std::move、万能引用/完美转发std::forward 详解

你能学到 左值 与 右值左值引用 与 右值引用 基本用法与作用拷贝构造函数 与 移动构造函数移动语义 与 std::move万能引用 与 引用折叠完美转发&#xff1a;std::forward 前言 本文代码片段中变量命名规则如下&#xff1a; 小写字母&#xff1a;一般类型的变量&#xff08;非…

egret 白鹭的编译太慢了 自己写了一个

用的swc 他会检测git的改变 const simpleGit require(simple-git); const fs require(fs); const path require(path); // 初始化 simple-git const swc require(swc/core); const baseDir D:\\project; const gameDir game\\module\\abcdefg; const gitDir D:\\projec…

Linux_线程的使用

目录 1、线程与进程的关系 2、线程的优缺点 3、创建线程 4、查看启动的线程 5、验证线程是共享地址空间的 6、pthread_create的重要形参 6.1 线程id 6.2 线程实参 7、线程等待 8、线程退出 9、线程取消 10、线程tcb 10.1 线程栈 11、创建多线程 12、__th…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本&#xff0c;它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下&#xff1a; IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

【面试题】手撕缓存LRU

设计LRU(最近最少使用)缓存结构&#xff0c;该结构在构造时确定大小&#xff0c;假设大小为K&#xff0c;并有如下两个功能 put(key, value)&#xff1a;将记录(key, value)插入该结构get(key)&#xff1a;返回key对应的value值 对于put(key, value)来说&#xff0c;我们需要…

如何设计数据中心100G网络光纤布线

随着全球企业对带宽的需求呈指数级增长&#xff0c;数据中心需要升级以增强其计算、存储和网络能力。数据中心从10G/25G向100G迁移成为必然趋势。随着网络升级&#xff0c;数据中心的光纤布线系统也需要随之优化。本文将指导您如何设计数据中心100G网络光纤布线。 100G以太网的…

python-快速上手爬虫

目录 前言 爬虫需谨慎&#xff0c;切勿从入门到入狱&#xff01; 一点小小的准备工作 直接上手爬取网页 1.获取UA伪装 2.获取url 3.发送请求 4.获取数据并保存 总结 前言 爬虫需谨慎&#xff0c;切勿从入门到入狱&#xff01; 一点小小的准备工作 对pip进行换源&#xf…

libevent的event管理相关接口

目录 4. 事件管理4.1 event_new功能备注原型 4.2 event_free功能备注原型 4.3 event_debug_unassign功能 备注4.4 event_add功能&#xff1a;备注&#xff1a;原型&#xff1a; 4.5 event_del功能备注原型 4.6 event_base_once功能备注原型: 4.7 event_pending功能备注原型 4.8…

Censot7 使用 yum 报错:Could not resolve host: mirrorlist.centos.org

解决方案&#xff1a;替换成阿里的镜像地址。 1&#xff1a;先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2&#xff1a;新建一个文件 touch /etc/yum.repos.d/CentOS-Base.repo 3&#xff1a;在新文件里写入以下内容 [base] name…

基于微信小程序图书馆座位预约系统设计与实现

链接: 文档和工程文件地址: ** 2、未完待续:请到目标位置下载 ** 链接: 文档和工程文件地址:

分布式搜索之Elasticsearch入门

Elasticsearch 是什么 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心&#xff0c;它集中存储您的数据&#xff0c;帮助您发现意料之中以及意料之外的情况。 Elastic Stack 又是什么呢&a…

排序系列 之 快速排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想&#xff0c;即在一个无序的序列中选取一个任意的基准元素base&#xff0c;利用base将待排序的序列分…

【吊打面试官系列-ZooKeeper面试题】分布式集群中为什么会有 Master?

大家好&#xff0c;我是锋哥。今天分享关于 【分布式集群中为什么会有 Master&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 分布式集群中为什么会有 Master&#xff1f; 在分布式环境中&#xff0c;有些业务逻辑只需要集群中的某一台机器进行执行&#xff0c…