搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
盐析白兔
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
BeautifulSoup4的使用_beautifulsoup4 java
2
ctfshow2024元旦杯web_ctfshow easy_include
3
【unity3D】TileMap基础知识(详细版)_unity tilemap
4
一键AI智能改写文章,提高文章写作效率
5
每日五道java面试题之spring篇(三)
6
FL Studio 21.1.0官方中文破解版下载安装激活教程重磅发布含注册机
7
台积电工业网络安全事件概述与解决方案
8
单词接龙C++_c++单词接龙
9
数据恢复关键技术与实战指南
10
使用Mybatis Log plugin没有生效问题解决办法_mybatis log free插件不生效
当前位置:
article
> 正文
【单例深思】枚举实现单例原理_java enum实现的单例
作者:盐析白兔 | 2024-02-28 04:08:00
赞
踩
java enum实现的单例
单例的枚举实现在《Effective Java》中有提到,因为其
功能完整、使用简洁、无偿地提供了序列化机制、在面对复杂的序列化或者反射攻击时仍然可以绝对防止多次实例化
等优点,
单元素的枚举类型
被作者认为是实现Singleton的最佳方法。
其实现非常简单,如下:
public
enum
Singleton {
INSTANCE
;
private
Singleton() {}
}
下面我们用一个枚举实现单个数据源例子来简单验证一下:
声明一个枚举,用于获取数据库连接。
public
enum
DataSourceEnum {
DATASOURCE
;
private
DBConnection
connection
=
null
;
private
DataSourceEnum() {
connection
=
new
DBConnection();
}
public
DBConnection getConnection() {
return
connection
;
}
}
模拟一个数据库连接类:
public
class
DBConnection {
}
测试通过枚举获取的实例是否相同:
public
class
Main {
public
static
void
main(String[]
args
) {
DBConnection
con1
= DataSourceEnum.
DATASOURCE
.getConnection();
DBConnection
con2
= DataSourceEnum.
DATASOURCE
.getConnection();
System.
out
.println(
con1
==
con2
);
}
}
输出结果为:
true
结果表明两次获取返回了相同的实例。
下面深入了解一下为什么枚举会满足线程安全、序列化等标准。
在JDK5 中提供了大量的语法糖,枚举就是其中一种。
所谓
语法糖(Syntactic Sugar)
,也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是但是更方便程序员使用。只是在编译器上做了手脚,却没有提供对应的指令集来处理它。
就拿枚举来说,其实Enum就是一个普通的类,它继承自
java.lang.Enum
类。
public
enum
DataSourceEnum {
DATASOURCE
;
}
把上面枚举编译后的字节码反编译,得到的代码如下:
public
final
class
DataSourceEnum
extends
Enum<DataSourceEnum> {
public
static
final
DataSourceEnum
DATASOURCE
;
public
static
DataSourceEnum[] values();
public
static
DataSourceEnum valueOf(String
s
);
static
{};
}
由反编译后的代码可知,
DATASOURCE
被声明为
static
的,
根据
在
【单例深思】饿汉式与类加载
中所描述的类加载过程,可以知道
虚拟机会保证一个类的
<clinit>()
方法在多线程环境中被正确的加锁、同步。所以,枚举
实现是在
实例化时是线程安全
。
接下来看看序列化问题:
Java规范中规定,
每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,因此在枚举类型的序列化和反序列化上,Java做了特殊的规定。
在序列化的时候Java仅仅是将枚举对象的name属性输出到结果中,反序列化的时候则是通过 java.lang.Enum 的
valueOf()
方法来根据名字查找枚举对象。
也就是说,以下面枚举为例,序列化的时候只将
DATASOURCE
这个名称输出,反序列化的时候再通过这个名称,查找对于的枚举类型,因此反序列化后的实例也会和之前被序列化的对象实例相同。
public
enum
DataSourceEnum {
DATASOURCE
;
}
由此可知,枚举天生保证序列化单例。
声明:
本文内容由网友自发贡献,转载请注明出处:
【wpsshop博客】
推荐阅读
article
java
时间
格式
YYYY
于
yyyy
的区别...
java
格式
时间
,注意参数大小写
java
时间
格式
YYYY
于
yyyy
的区别
java
&nb...
赞
踩
article
Java
WEB
面试系列-
01
...
Servlet是用
Java
编写的服务器端程序, 其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Serv...
赞
踩
article
Java
项目:
医院
挂号
管理系统
(
java
+
SpringBoot
+Vue+ElementUI+Layu...
项目介绍基于
SpringBoot
Vue的
医院
信管系统角色:管理员、用户、医生管理员:首页、个人中心、用户管理、医生管理...
赞
踩
article
Java实现
房屋
出售出租
系统
JAVA
+
Vue
+
SpringBoot
+
MySQL
...
基于
JAVA
+
Vue
+
SpringBoot
+
MySQL
的
房屋
出售出租
系统
包含了
房屋
销售模块、
房屋
出租模块、预定意向模块、...
赞
踩
article
【
JAVA
】《
接口
,
抽象
方法
,
抽象
类
》之四 、
开发
实践...
首先定义一个
接口
,
其中包含一个
抽象
方。这种设计模式的应用场景是在需要一种默认的行为
,
但这种行为又可能因为不同的子类而不同...
赞
踩
article
Azure
Blob
Storage
基本用法上传/下载(Java)_
java
azure
stor...
文章目录简单概念
Blob
Storage
Azure
Blob
Storage
的存储结构
Azure
Storage
Acc...
赞
踩
article
Netty
多语言(
Java
、
Android
、
C#
、
WebSocket
)通信实例
Demo
(一)概述...
转载请注明出处,原文地址:https://blog.csdn.net/lucherr/article/details/8...
赞
踩
article
java
/php/
net
/
python
民宿
网站
管理系统
设计_
民宿
管理系统
业务
流程图
...
本系统带文档lw万字以上+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,...
赞
踩
article
java
geohash
_
GitHub
-
GongDexing
/
Geohash
:
GeoHash
是...
Geohash
GeoHash
是目前比较主流实现
位置服务
的技术,
Geohash
算法将经纬度二维数据编码为一个字符串,本质是...
赞
踩
article
geohash
java
距离
排序
_
APP
筛选
附近
的人并
排序
(
geohash
算法)...
之前做项目时有个tab是
附近
的人,思路是
APP
端上传定位(经纬度),服务端通过一个谷歌公式就能计算出两个定位的
距离
,因为...
赞
踩
article
Google
S2
算法
Java
操作_
s2
算法...
Google
S2
算法
Java
操作获取指定子级的边界Cell获取指定子级的边界Cell/** * 求当前cellI...
赞
踩
article
华为OD机试 -
分配
土地
(
Java
& JS &
Python
&
C
&
C
++
)_从前有个村庄...
华为OD机试 -
分配
土地
(
Java
& JS &
Python
&
C
&
C
++
),考察:几何问题_从前有个村庄,村...
赞
踩
article
【开源】
JAVA
+
Vue
.
js
实现
考研
专业课程
管理系统
...
基于
JAVA
+
Vue
+SpringBoot+MySQL 的
考研
专业课程
管理系统
,包含了
考研
课程、
考研
专业、
考研
注册、
考研
...
赞
踩
article
Java
+
springboot
+
Thymeleaf
前后端分离项目:在线
购物
商城
平台
系统答辩PPT参考...
Java
+
springboot
+
Thymeleaf
前后端分离项目:在线
购物
商城
平台
系统答辩PPT参考毕设毕业设计,黄菊华...
赞
踩
article
java
+集成
消息
rabitmq
_
消息
队列
RabbitMQ
与
Spring
整合使用的实例代码...
一、什么是
RabbitMQ
RabbitMQ
是实现 AMQP(高级
消息
队列协议)的
消息
中间件的一种,最初起源于金融系统...
赞
踩
article
rabbit
mq
-
java
基础详解_
mq
通配符
和
路由
模式
java
...
MQ(Message Queue)消息队列,是分布式系统的重要组件,从而实现高性能,高可用,可伸缩和最终一致性的架构,r...
赞
踩
article
JAVA
-
MAVEN
初学者教程(配置、
pom
.
xml
、依赖管理等)_
java
怎么
创建
pom
.
xml
...
常用来定义一些版本等,后序可以使用,方便修改,类似编程时的全局变量。使用时使用${标签值即可}_
java
怎么
创建
pom
...
赞
踩
article
IDEA+
Java
+
SSM
+
Mysql
+
Bootstrap
+
Maven
实现网上书城系统_idea在线...
IDEA+
Java
+
SSM
+
Mysql
+
Bootstrap
+
Maven
实现网上书城系统,实现用户的登录注册,实现浏览书籍...
赞
踩
article
基于
java
web+jsp的校园宿舍
管理系统
(
java
+jsp+
java
web+
mysql
+
ajax
...
一、项目简述功能:宿舍管理员,最高管理员,学生三个身份,包括学 生管理,宿舍管理员管理,考勤管理,宿舍楼管理,缺勤 记录...
赞
踩
article
java
国密
算法
工具
类(支持
SM2
SM3
SM4
)_
sm2
加密
工具
类...
工具
采用BC库实现,支持前后端加解密,前端建议使用sm-crypto。_
sm2
加密
工具
类
sm2
加密
工具
类 ...
赞
踩
相关标签
java
前端
面试
spring boot
vue.js
layui
elementui
mysql
开发语言
spring
房屋系统
Azure Storage Blob
java geohash
geohash java 距离排序
算法
华为机试
Java
JavaScript
Python
C语言
C++