0

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

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

这变得很啰嗦。我是否应该包装这个对象,这样它就A永远不会nullgetB(); 如果这是一个好主意,我应该怎么做,我应该提供一个引发错误的实现InvalidImplemetationException并强制它被捕获。

4

2 回答 2

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();
于 2013-01-22T01:47:34.073 回答
0

在这种情况下,我建议您将b == null代码放入getB函数中。

看来您确实做了一些研究并选择了一个非常好的例外。

一个很好的选择是,而不是抛出一个返回一个新对象的异常B

于 2013-01-22T00:43:59.587 回答