浅谈使用单元素的枚举类型实现单例模式
来源:互联网 发布:linux合并两个文件夹 编辑:程序博客网 时间:2024/06/05 15:43
通常情况下,我们写单例模式的时候无非就是三个步骤:构造器私有化,声明私有静态变量,提供静态获取实例的方法。简单说就是以下这种方式:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
这是最基本的单例模式的写法,考虑到线程安全的问题,会用synchronized
关键字修饰getInstance()
方法,另外还有饿汉式、懒汉式、静态内部类、双重校验锁的写法。
但是这种写法存在缺陷,可以利用反射的方式来实例化多个不同的实例,如下所示:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
这种情况下,就会出现多个不同的实例,从而导致一些乱七八糟的结果。
还有一种情况就是在序列化和反序列换的时候也会出现多个不同的实例,如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
这种情况也会出现有多个实例的问题,这个问题可以在类中添加readResolve()
方法来避免,即:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
这样在反序列化的时候就不会出现多个实例。
使用单元素的枚举实现单例模式
一个最简单的POJO类,如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
测试方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
这种实现单例模式的方式是在 1.5之后才出现的,
这种方法在功能上与公有域方法相近,但是它更加简洁,无偿提供了序列化机制,绝对防止多次实例化,即使是在面对复杂序列化或者反射攻击的时候。虽然这种方法还没有广泛采用,但是
单元素的枚举类型已经成为实现Singleton的最佳方法
。 —-《Effective Java 中文版 第二版》
阅读全文
0 0
- 浅谈使用单元素的枚举类型实现单例模式
- 浅谈使用单元素的枚举类型实现单例模式
- 浅谈使用单元素的枚举类型实现单例模式
- 使用单元素枚举类实现单例模式
- 单元素的枚举类型实现单例
- 使用单枚举类型实现单例
- 单元素枚举类实现单例模式
- 单例模式(增加枚举类型的单例模式)
- 单例--使用枚举类型实现
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- container和container-fluid之间的区别
- [Leetcode] 344. Reverse String 解题报告
- Spring 之AOP AspectJ切入点语法详解
- 所学jQuery来自w3cSchool
- Java多线程的总结
- 浅谈使用单元素的枚举类型实现单例模式
- 51Nod-1060-最复杂的数(反素数)
- 文档资料
- APACHE安装与配置
- panel顺序影响到Dock
- 蚂蚁搬新家了,还在办公室搞了个音乐节
- javascript字符串操作
- md5算法加密实现
- STM32 GPIO 入门知识