我应该如何包装来自未知来源的对象

时间:2013-01-22 00:39:00

标签: java wrapper

我有一个带有未知来源的许多接口实现的应用程序。我想清理我的源代码,这样我就不需要写了:

A a = AFactory.getImpl();
B b = a.getB();
if(b == null) return;
b.doSomething();

这变得非常漫长。我是否应该包装此对象,以便A永远不会从null返回getB();如果这是一个好主意,我应该怎么做,我是否应该提供一个引发错误的实现,如InvalidImplemetationException并强制它被捕获。

2 个答案:

答案 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的新对象。