【发布时间】:2013-12-31 19:48:57
【问题描述】:
如何打破java中的单例类? 单例模式确保一个类只有一个实例,并提供一个全局访问点。
类的默认构造函数是私有的,这样可以防止其他类直接实例化该对象。
静态修饰符应用于返回对象的实例方法,因为它使该方法成为类级别的方法,无需创建对象即可访问
编辑:
public class Singleton {
private static Singleton singleInstance;
private Singleton() {
System.out.println("Singleton Constructor Running...");
}
public static Singleton getInstance() {
if (singleInstance == null) {
synchronized (Singleton.class) {
if (singleInstance == null) {
singleInstance = new Singleton();
}
}
}
return singleInstance;
}
}
使用反射打破单例
import java.lang.reflect.Constructor;
public class BreakSingletonUsingReflection {
public static void main(String[] args) {
Singleton instanceOne = Singleton.getInstance();
Singleton instanceTwo = null;
try {
Constructor[] constructors = Singleton.class.getDeclaredConstructors();
for (Constructor constructor : constructors) {
//Below code will destroy the singleton pattern
constructor.setAccessible(true);
instanceTwo = (Singleton) constructor.newInstance();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(instanceOne.hashCode());
System.out.println(instanceTwo.hashCode());
}
}
【问题讨论】:
-
你所说的“中断”是什么意思?
-
如果用
enum来实现呢? -
public static Singleton getInstance() { if (singleInstance == null) { synchronized (Singleton.class) { if (singleInstance == null) { singleInstance = new Singleton(); } } } 返回单实例; }
-
这闻起来像 an XY problem. 你想要实现的最终目标是什么?
-
为数据库类创建单个对象
标签: java