单身和异常

Cap*_*ngs 30 java singleton exception

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

在这里,我有一个Singleton(使用Bill Pugh的方法,在Wiki for 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;
    }
Run Code Online (Sandbox Code Playgroud)

如果在2处抛出异常,我想将其传播给调用者.但是,我不能从第1行抛出异常.

那么,如果没有正确创建单例对象,我唯一的选择是返回一个空对象吗?

谢谢

PS我确实意识到如果它通过不同的类加载器加载或者如果反射性地加载,这个Singleton可能会破坏,但它对我的目的来说已经足够了.

// UPDATE

我很好奇,我可以不重新安排我的设计,如下所示抛出异常吗?

此外,我不需要任何同步(类加载器保证静态内部类只加载一次,并且仅在调用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();
 }
Run Code Online (Sandbox Code Playgroud)

再次感谢.

Bal*_*usC 36

使用静态初始化程序并重新抛出Exceptionas ExceptionInInitializerError.单击链接以阅读Javadoc,您将看到它完全适合此特定功能要求:在静态初始化期间处理异常.事实上,单身实体不仅仅是一个静态和懒惰的初始化全局对象.

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

不需要双重检查锁定习语,这被认为是反模式,在某些情况下甚至是不安全的.