设计可能引发异常的单例类的最佳方法是什么?
在这里,我有一个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(); }
再次感谢。
使用静态初始值设定项,然后将Exceptionas 扔掉ExceptionInInitializerError。单击链接以阅读Javadoc,您将看到它完全适合此特定功能要求:在 静态初始化 期间处理异常。实际上,单例仅仅是静态和延迟初始化的全局对象。
Exception
ExceptionInInitializerError
private static class SingletonObjectFactoryHolder{ private static final ObjectFactory INSTANCE; static { try { INSTANCE = new ObjectFactory(); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } }
不需要双重检查的锁定习惯,这是一种反模式,在某些情况下甚至是不安全的。