您的位置:首页 > 其它

几种不同类型的Singleton

2013-03-23 13:17 288 查看
废话不多说,直接上代码。

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: