假设我有以下类(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/