gpt4 book ai didi

java Singleton - 通过反射防止多次创建

转载 作者:IT老高 更新时间:2023-10-28 20:32:44 25 4
gpt4 key购买 nike

我有一个这样的单例。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com