单身和exception

什么是设计可能抛出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; } 

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

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

谢谢

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

// UPDATE

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

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

再次感谢。

使用静态初始化程序并将Exception重新抛出为ExceptionInInitializerError 。 单击链接以阅读Javadoc,您将看到它完全适合此特定function要求:在静态初始化期间处理exception。 事实上,单例实际上不仅仅是一个静态和延迟初始化的全局对象。

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

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

只是不要从对象的构造函数中抛出exception。 如果有必要,您可以提供init ()方法并从那里抛出exception。

你可以在getInstance中检查null INSTANCE,然后懒洋洋地初始化它。 但通常情况下,如果你可以使构造函数更安全,那么最好的构造函数不会抛出。

我同意Arne Burmeister,其代码如下:

 private static class SingletonObjectFactoryHolder { private static ObjectFactory INSTANCE; private ObjectFactory() { } public static String getInstance() throws Exception { return (INSTANCE == null) ? (INSTANCE = new ObjectFactory()) : INSTANCE; // A ternary operator might not be the best fit if you need to throw an exception, but I think it looks nicer than the if(INSTANCE==null){} else{} for lazy instantiation. } }