0

ソースが不明なインターフェイス実装がいくつかあるアプリケーションがあります。ソースコードをクリーンアップして、次のように書く必要がないようにしたかったのです。

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

これは非常に長くなります。このオブジェクトをラップして、 ;からA戻らないようにする必要があります。そして、それが良い考えである場合、どのようにそれを行うべきですか、のようなエラーをスローし、それを強制的にキャッチする実装を提供する必要があります。nullgetB()InvalidImplemetationException

4

2 に答える 2

1

BNull Object Patternの使用を検討する必要があります。実際にはがない場合に、必要な動作をカプセル化する値を定義します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.NULLnullB.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 に答える