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

标签 java singleton

我有一个这样的单例。

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/

相关文章:

java - 当测试在完全相同的语句处崩溃时,为什么调用堆栈会不同?

javax.ws.rs.NotSupportedException : Could not find message body reader for type: class com. sun.jersey.core.header.FormDataContentDisposition

java - 如何将提醒的长度分成相等的部分?

java - Logback 将我的日志消息丢失到文件

java - java中的BufferStrategy中的图像闪烁?

java - 2 关于单例模式/渴望初始化和同步

javascript - 理解 Javascript 中的单例对象

algorithm - 用于故障转移的分布式单例服务

Python:将模块及其变量视为单例——干净的方法?

ios - 在 Singleton Objective C 中删除 NSNotificationCenter 的观察者