2

クラスが他のクラスの属性として埋め込まれている一般的な状況で、null をチェックする最良の方法は何ですか?

私が話していることを説明するために、this.getObject1().getObject2().someMethod()wheregetObject1()またはgetObject2()could returnにアクセスしたいとしますnull。現在、私は次のことを行っていますが、それは醜く、より良い方法が必要です:

if (this.getObject1() != null)
        if (this.getObject1().getObject2() != null)
            if (this.getObject1().getObject2().someMethod())
                return whatever;

NPE を回避するには、someMethod() にアクセスする前に、各ステップで null をチェックする必要があります。これを達成するためのより良い方法は何ですか?

4

5 に答える 5

3

もう 1 つのオプションは、各メソッドの結果を変数に設定することです。これにより、毎回メソッドを再呼び出しする必要がなくなります。だから、このようなもの

Object obj1 = this.getObject1();
if (null != obj1)
{
    Object obj2 = obj1.getObject2();
    if (null != ob2)
    {
         Object obj3 = obj2.someMethod();
         if (null != obj3)
               return whatever;
    }
}

ifメソッドが高価でない場合は、 Chris Nava のソリューションのようにすべてを同じ内で実行することにより、コードを減らすことができます。

于 2012-07-26T21:09:44.577 に答える
2

ネストされた if() の代わりに && を使用します。それは(ほぼ間違いなく)ほんの少しだけきれいですが、それでも私が望むものではありません.

if (
    this.getObject1() != null
    &&
    this.getObject1().getObject2() != null
    &&
    this.getObject1().getObject2().someMethod()
  ) {
            return whatever;
}
于 2012-07-26T21:14:41.763 に答える
1

次のように、より単純化できます(少なくとも読みやすくなります)。

Object o1 = getObject1();
if(o1 != null)
{
    Object o2 = getObject2();
    if(o2 != null)
    {
        if(o2.someMethod()) return whatever;
    }
}
于 2012-07-26T21:12:04.217 に答える
1

できることはあまりありません。つまり、各ステップを変数に割り当てることはできますが、最終的にはコードが増え、リフレクションを使用してそれを行うためのジェネリックメソッドを作成できますが、実際には理由がないため、パフォーマンスが大幅に低下します。 。

于 2012-07-26T21:12:06.817 に答える
1

このスタイルは可能な限り避けるべきです-デメテルの法則を参照してください- ただし、ライブラリやレガシー コードが多くの選択肢を残していない可能性があることは理解しています。

関数型プログラミング言語 (特に) は、Java である程度使用できるOptionorオブジェクトを使用することで、この問題を回避します。たとえば、この記事Maybeを参照してください。Null チェックの長いシーケンスは、Scala の for-comprehensions を使用して簡潔に回避できます。しかしJavaに戻る...

理想的には、呼び出しているコードを変更できると仮定して、「外側」オブジェクトを呼び出すことができるように再構築し、それが「内側」オブジェクトを呼び出し、各段階でヌル チェックを 1 回だけ行います。または、コードを再構築して、そのような深いネストを回避します。

于 2012-07-26T21:48:51.400 に答える