我有一个这样的单例。
public class BookingFactory {
private final static BookingFactory instance;
static {
instance = new BookingFactory();
}
public static BookingFactory getInstance() {
return instance;
}
private BookingFactory() {
System.out.println("Object is created.");
}
}
public class Test {
BookingFactory instance = BookingFactory.getInstance();
instance = BookingFactory.getInstance();
Class<?> clazz = Class.forName("com.test.BookingFactory");
Constructor pvtConstructor = clazz.getDeclaredConstructors()[0];
// Set its access control
pvtConstructor.setAccessible(true);
// Invoke Private Constructor
BookingFactory notSingleton = (BookingFactory) pvtConstructor.newInstance(null);
}
当我运行它时,我看到了不止一条打印输出消息。有什么办法可以防止这个单例从这个反射中多次实例化?
谢谢。
最佳答案
尝试使用 enum
。枚举是好的单例。
public static enum BookingFactory {
INSTANCE;
public static BookingFactory getInstance() {
return INSTANCE;
}
}
您不能通过反射创建枚举。
getInstance() 方法是多余的,但可以更轻松地运行测试,抛出以下异常:
java.lang.IllegalArgumentException: Cannot reflectively create enum objects
at java.lang.reflect.Constructor.newInstance(Constructor.java:530)
at MultiSingletonTest.main(MultiSingletonTest.java:40)
哦,看,有人已经给出了枚举答案。无论如何发布以获得更多完整性。
关于java Singleton - 通过反射防止多次创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910851/