用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)

原创 2009年03月12日 14:02:00

 我们常用的构造单例模式(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》Second Edition中文版笔记(完整)

第2章 创建和销毁对象
  • youngsend
  • youngsend
  • 2015年09月09日 14:30
  • 2545

《Effective java》—–读书笔记

2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习、看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础、Spring研究、java并...
  • chenssy
  • chenssy
  • 2016年05月04日 08:55
  • 10733

Java枚举使用以及枚举实现单例模式

JDK 1.5 之前需要自定义枚举类 JDK 1.5 新增的enum关键字用于定义枚举类 若枚举只有一个成员,则可以作为一种单例模式的实现方式。 枚举类型是指由一组固定的常量组成合法值的类型,枚...
  • u014082714
  • u014082714
  • 2016年08月22日 00:24
  • 3661

Effective.Java 读书笔记(3)关于单例模式

3.Enforce the singleton property with a private constructor or an enum type 大意为 使用parivate的构造方法或者一个枚...
  • qq_34206952
  • qq_34206952
  • 2017年02月12日 16:49
  • 135

[java]jdk1.5的新特性----可变参数、增强for循环、枚举、单例模式

可变参数---        public int add(int[] a);        public int add(int ...a);        ---可变参数相当于数组,但是上面...
  • guomeijuan916
  • guomeijuan916
  • 2012年08月14日 23:10
  • 2075

《Effective java 第2版》读书笔记--泛型与枚举

第五章 泛型 第二十三条:不要在新代码中使用原生态类型1.泛型的原生态类型:List对应的是不带任何实际参数类型的List2.泛型的优点:(1)插入元素时自带类型检查(2)删除元素是不需要进行手工转...
  • baiye_xing
  • baiye_xing
  • 2017年05月05日 21:20
  • 136

Effective Java读书笔记(三):泛型、枚举、注解、异常

来到读书笔记的第三篇了,这一次的主题是讲泛型、枚举、注解这三个Java1.5引入的语言特性。关于泛型,很久以前我写过一篇初识的文章,http://blog.csdn.net/leelit/articl...
  • leelit
  • leelit
  • 2016年04月02日 20:02
  • 696

【Effective Java中文版】第二版:第三章 对于所有对象都通用的方法[002] [20180110]

第10条:始终要覆盖toString 第11条:谨慎地覆盖clone Cloneable接口的目的是作为对象的一个mixin接口(mixin interface),见第18条, 表明这样的...
  • bas_ball
  • bas_ball
  • 2018年01月10日 14:48
  • 4

【Effective Java中文版】第二版:第三章 对于所有对象都通用的方法[003] [20180110]

第12条:考虑实现Comparable接口 与本章中讨论的其它方法不同,compareTo方法并没有在Object中声明,相反,它是Comparable接口中唯一的方法,compareTo方法不但允...
  • bas_ball
  • bas_ball
  • 2018年01月10日 17:43
  • 9

【Effective Java中文版】第二版:第四章 类和接口[002] [20180112]

第14条在公有类中使用公有方法而非公有域 Jvava平台类库中有几个类违反了该条告诫。显著的例子包括java.awt的Point和Dimension类。它们是不值得效仿的例子。 第15条:使可变性最小...
  • bas_ball
  • bas_ball
  • 2018年01月12日 16:36
  • 2
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)
举报原因:
原因补充:

(最多只允许输入30个字)