用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)
来源:互联网 发布:ubuntu deepin qq 编辑:程序博客网 时间:2024/05/01 14:54
我们常用的构造单例模式(Singleton)的方法,一般有2种
1 提供一个静态的公共属性
2 提供一个静态的公共方法
这2个方法,都是采用了私有的构造器来防止外部直接构造实例。 但我们可以用反射的方法,获得多个实例。后面我会给出测试的代码。
从1.5开始,枚举也可以用来获得单例,而且更加可靠。同时又自动提供了一些额外的功能。
先看看测试代码:
测试结果
TestSingleton1@c17164/TestSingleton1@1fb8ee3
false
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at TestSingleton.testSingleton2(TestSingleton.java:43)
at TestSingleton.main(TestSingleton.java:11)
Caused by: java.lang.RuntimeException: 实例只能建造一次
at TestSingleton2.<init>(TestSingleton.java:103)
... 6 more
java.lang.IllegalArgumentException: Cannot reflectively create enum objects
at java.lang.reflect.Constructor.newInstance(Constructor.java:511)
at TestSingleton.testSingleton3(TestSingleton.java:61)
at TestSingleton.main(TestSingleton.java:12)
小结:可见,只有第三种枚举的方法才是最安全的。
关于里面提到的,在序列化是可能出现的问题,我看以后在讨论吧。不过因为枚举实现的单例没有这个问题,所以我看以后就用枚举好了,何必自己跟自己过不去呢?
- 用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)
- Effective Java 中文版第二版的读书心得(一)
- Effective Java 中文版第二版的读书心得(二)
- Effective Java 中文版第二版的读书心得(四)通过私有构造器强化不可实例化的能力
- [java]jdk1.5的新特性----可变参数、增强for循环、枚举、单例模式
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 枚举类型的单例模式(java)
- 第二章 - 有意义的命名 - 读书心得
- 【JAVA】三 【设计模式】一 JAVA 单例 枚举
- Java的单例模式和枚举类
- 枚举类型的单例模式(java)五种
- CSDN的新IM投入测试?我在博客里看到了!
- .net C# 算法
- 做程序其实可痛苦的了......
- Spring AOP+ehCache简单缓存系统解决方案
- GPRS分类
- 用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)
- 2008年看的几部剧集和电影
- ListView基本用法大全
- 基于VC++的GDI常用坐标系统及应用
- 任务栏显示桌面恢复
- VC异或画图
- 追羊的智慧
- 在xml的汪洋中遨游之mule篇
- 世界需要一种什么样的语言?