Java实例成员初始化抛出异常

标签 java multithreading member-initialization

假设我有以下类(class)

public class A {
   private B b;
}

现在有一个工厂用于创建B的实例,但是创建者方法抛出异常

public class BCreatorFactory {
   public static createB() throws SomeException {
      // DO the intialization
      // ...
      return b;
}

如果我在声明行中设置 A.b 那么我将无法处理异常

public class A {
   private B b = BCreatorFactory.createB() // BAD -> no way of dealing with the exception
}

如果我在构造函数中设置 A.b,那么我要么有一个“半成品”实例,要么再次抛出异常并强制调用代码处理未正确初始化的实例

public class A {
   private B b;

   public A() {
      try {
         b = BCreatorFactory.createB();
      }
      catch (SomeException se) {
      // Do something, perhaps try to recover ? <- IMO also BAD
      }
   }
}

public class A {
   private B b;

   public A() throws SomeException { // BAD
      b = BCreatorFactory.createB();
   }
}

我可以尝试延迟初始化 B 的实例:

public class A {
   private B b;

   public B getB() throws SomeException {
      if (b == null) {
          b = BCreatorFactory.createB(); // BAD -> not thread safe -> can result in redundant createB() invocations
      }
      return b;
   }
}

但是我能想到的使其线程安全的唯一方法是通过已知在java的JVM中被破坏双重检查锁定

public class A {
   private B b;

   public B getB() throws SomeException {
       if (b == null) {
            synchronized(this) {
                if (b == null) {
                    b = BCreatorFactory.createB(); // BAD -> not really thread safe -> broken
                }
            }
       }
       return b;
   }
}

那么,亲爱的耐心读者,我应该做什么?

换句话说,初始化包含对创建时可能引发异常的对象的引用的对象实例的最佳解决方案是什么?

最佳答案

这有什么问题吗?

public class A {
   private B b;

   public A() throws SomeException { // BAD -- *no it's not*
      b = BCreatorFactory.createB();
   }
}

构造函数抛出异常并没有什么问题。

关于Java实例成员初始化抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8259507/

相关文章:

java - 逆波兰表示法时出现问题(Java)

java - 如何捕获多个异常,然后将它们传递给特定的处理程序?

java - Spring MVC : Sharing context within ear

java - 在 intellij 的 GWT 配置中更改 Super Dev Mode 端口参数

multithreading - 我可以使用 pthreads 分配每个线程索引吗?

C# 后台线程如何告诉 UI 线程它已经完成某事?

java - 如何进行延迟的非阻塞函数调用

c++ - 成员初始化器列表。参数评估顺序

c++ - unique_ptr 无法初始化

c++ - 有条件地初始化 C++ 成员变量的正确方法?