小编典典

单例和例外

java

设计可能引发异常的单例类的最佳方法是什么?

在这里,我有一个Singleton(使用Bill Pugh的方法,在Wiki中为Singleton记录)。

    private static class SingletonObjectFactoryHolder{
    //1  
        private static final ObjectFactory INSTANCE = new ObjectFactory();
    }

    private ObjectFactory() throws Exception{
    //2
            //create the factory
    }


    public static ObjectFactory getInstance(){
    //3
        return SingletonObjectFactoryHolder.INSTANCE;
    }

如果在2处引发异常,我想将其传播给调用方。但是,我不能从第1行引发异常。

因此,如果单例对象创建不正确,我唯一的选择是返回空对象吗?

谢谢

PS我确实意识到,如果该Singleton通过不同的类加载器加载或反射加载,则可能会损坏,但是对于我的目的来说已经足够了。

//更新

我很好奇,是否可以不按如下所示重新安排设计以引发异常?

另外,我不需要任何同步(类加载器保证静态内部类仅在调用getInstance()时才加载一次)。因此,线程安全和延迟实例化了吗?

 private static class SingletonObjectFactoryHolder{
        //1  
           public static ObjectFactory getInstance() throws Exception{
         return new ObjectFactory();
           }
 }

 private ObjectFactory() throws Exception{
        //2
        //create the factory
 }


 public static ObjectFactory getInstance(){
        //3
    return SingletonObjectFactoryHolder.getInstance();
 }

再次感谢。


阅读 220

收藏
2020-10-18

共1个答案

小编典典

使用静态初始值设定项,然后将Exceptionas
扔掉ExceptionInInitializerError。单击链接以阅读Javadoc,您将看到它完全适合此特定功能要求:在
静态初始化 期间处理异常。实际上,单例仅仅是静态和延迟初始化的全局对象。

private static class SingletonObjectFactoryHolder{
    private static final ObjectFactory INSTANCE;
    static {
        try {
            INSTANCE = new ObjectFactory();
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}

不需要双重检查的锁定习惯,这是一种反模式,在某些情况下甚至是不安全的。

2020-10-18