假设我有以下课程
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;
}
}
那么,亲爱的耐心读者,我该怎么办?
换句话说,初始化包含对创建的对象的引用的对象实例的最佳解决方案可能会引发异常?