几种不同类型的Singleton
2013-03-23 13:17
288 查看
废话不多说,直接上代码。
最佳的方式是通过Enum来获得Singleton,可以防止反射创建不同的Singleton实例
测试代码如下:
public class Singleton { private Singleton() { } /** * 方式1(饿汉模式) 通过反射会得到不同的instance */ private static final Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } /** * 方式2(懒汉模式) 通过反射会得到不同的instance */ private static Singleton instance2 = null; public synchronized static Singleton getInstance2() { if (instance2 == null) { instance2 = new Singleton(); } return instance2; }
最佳的方式是通过Enum来获得Singleton,可以防止反射创建不同的Singleton实例
public enum SingletonEnum { INSTANCE; public static SingletonEnum getInstance() { return INSTANCE; } }
测试代码如下:
@Test public void test() { Singleton instance=Singleton.getInstance(); try { //获得Class对象 Class c=Class.forName("com.pyy.Singleton"); //所有定义的Constructors 包括private、protected、public、默认的 Constructor cons[] =c.getDeclaredConstructors(); Constructor con=cons[0]; //可以访问private con.setAccessible(true); //通过反射创建Singleton Instance Singleton instance2=(Singleton)con.newInstance(); //输出false ,说明通过反射可以得到不同的Instance System.out.println(instance==instance2); } catch (Exception e) { e.printStackTrace(); } }
/** * 通过Enum的方式创建Singleton,可以防止反射创建Singleton Instance * 下面方法会抛出java.lang.IllegalArgumentException: Cannot reflectively create enum objects * 的异常。 */ @Test public void testEnum() { SingletonEnum instance=SingletonEnum.getInstance(); try { Class c=Class.forName("com.pyy.SingletonEnum"); Constructor cons[] =c.getDeclaredConstructors(); Constructor con=cons[0]; con.setAccessible(true); SingletonEnum instance2=(SingletonEnum)con.newInstance(); System.out.println(instance==instance2); } catch (Exception e) { e.printStackTrace(); } }
相关文章推荐
- 几种不同类型的消息队列
- textfield/textview的子类,实现功能:几种不同类型的最大输入字符串字数限制,剩余可输入字符数,emoji表情过滤
- 几种不同类型的消息队列
- 几种不同类型网站内容优化切入点
- 把不同类型的文件导入数据库中的几种方法
- spring笔记--依赖注入之针对不同类型变量的几种注入方式
- python中几种不同类型的参数的区分及其定义时的顺序
- 几种不同类型Heap的对比
- UIStoryboardSegue(二)segue几种不同的类型
- 几种不同类型的同事分析
- 依赖注入之针对不同类型变量的几种注入方式
- J2EE中几种不同类型的部署描述模块
- C小知识点:C语言中不同类型数据所占字节数汇总
- 如何在Visual Studio.net中让同一解决方案中包含多个不同类型的项目并共享同一命名空间
- response的contentType 几种类型
- 不同数据源之间数据同步的几种实现方式
- C语言消息队列-消息类型不同的发送和接收
- Linux环境编程1. 实例详解文件锁(file lock)的两种不同类型,advisory lock和mandatory lock
- PCL 不同类型的点云之间进行类型转换
- 利用预编译器 实现 .NET下不同类型程序的 通用 类库