我有一个带有未知来源的许多接口实现的应用程序。我想清理我的源代码,这样我就不需要写了:
A a = AFactory.getImpl();
B b = a.getB();
if(b == null) return;
b.doSomething();
这变得非常漫长。我是否应该包装此对象,以便A
永远不会从null
返回getB()
;如果这是一个好主意,我应该怎么做,我是否应该提供一个引发错误的实现,如InvalidImplemetationException
并强制它被捕获。
答案 0 :(得分:1)
您应该考虑使用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();
答案 1 :(得分:0)
在这种情况下,我建议您将b == null
代码放在getB
函数中。
你似乎做了一些研究并选择了一个非常好的例外。
一个好的替代方法是抛出一个异常,返回一个B
的新对象。