0

假设我有以下课程

public class A {
   private B b;
}

现在有了创建B实例的工厂,但是creator方法抛出异常

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

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

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

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

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;
   }
}

那么,亲爱的耐心读者,我该怎么办?

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

4

2 回答 2

3

这有什么问题?

public class A {
   private B b;

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

构造函数抛出异常并没有错。

于 2011-11-24T15:57:03.687 回答
0

构造函数抛出异常并没有错。Java 框架中的许多类都会从构造函数中抛出异常。只要您有一种自动处理和解决情况的方法,在构造函数中捕获异常也很好。Java 中检查异常的要点是,您不能只是忽略错误条件,而必须在某处处理它。

我抛出异常并强制调用代码处理未正确初始化的实例

调用代码不必处理未正确初始化的实例,它会自动进入 catch 块,您应该在其中对异常进行处理,无论是抛出、记录、失败等。

于 2011-11-24T16:21:23.663 回答