我有一个应用程序,其中包含许多来源未知的接口实现。我想清理我的源代码,这样我就不需要编写:
A a = AFactory.getImpl();
B b = a.getB();
if(b == null) return;
b.doSomething();
这变得很啰嗦。我是否应该包装这个对象,这样它就A
永远不会null
从getB()
; 如果这是一个好主意,我应该怎么做,我应该提供一个引发错误的实现InvalidImplemetationException
并强制它被捕获。
您应该考虑使用 Null 对象模式:定义一个值B
来封装您在没有B
. 在这种情况下,这意味着doSomething()
什么都不做。
B
看起来像这样:
public class B {
public static final B NULL = new B() {
public void doSomething() {
}
};
public static B fromA(A a) {
B b = a.getB();
return b == null ? NULL : b;
}
public void doSomething() {
...
}
}
你会像这样使用它:
A a = AFactory.getImpl();
B.fromA(a).doSomething();
如果你可以改变AFactory.getImpl
,让它返回B.NULL
而不是null
. 然后你不需要B.fromA
,你可以这样做:
A a = AFactory.getImpl();
a.getB().doSomething();
在这种情况下,我建议您将b == null
代码放入getB
函数中。
看来您确实做了一些研究并选择了一个非常好的例外。
一个很好的选择是,而不是抛出一个返回一个新对象的异常B
。