2

このような階層状況がある場合:

class foo1{
    Foo2 foo2;
}

class foo2 {
    List<Foo3> foo3;
}

class foo3 {
}

class foo4 extends foo3 {
    Foo5 foo;
}

class foo5 {
    double value;
}

最終的に取得したいのですdouble valueが、そこにたどり着くには、階層を下ってすべてのヌルをチェックする必要があります。私はこのようなことができます:

if(foo1 != null) {
    if(foo.foo2 != null) {
        if(foo.foo2.foo3 != null) {
            if( ((foo4) foo.foo2.foo3).getFoo5() != null) {
                if(((foo4) foo.foo2.foo3).getFoo5().getValue() != null) {
                    //do something
                }
            }
        }
    }
}

しかし、それは非常に見苦しく見えます。おそらく、同じ目標を達成するためのもっと簡単でクリーンな方法があるでしょう。リフレクションの使用に遭遇しましたが、上記の方法でそれをどのように使用するかはよくわかりません。NPEを投げずにそれを行う方法はありますか?

4

2 に答える 2

2

本当にありません。おそらくこれは Java の欠陥です (少なくとも Java 7 では、Scala または Optional 型を参照)。

つまり、NPE を投げるだけです。実際の状況では、それらのほとんどは null であってはなりません。たとえば、PersonクラスにfirstNameフィールドがある場合、実際には常にfirstNameプレゼントが必要です。が存在するかどうかを確認する必要はありませんfirstName。そうでない場合は、エラーです。エラーの場合は、エラーをスローします。

理由:他に何をするつもりですか?最も内側の値が更新されているかどうかにかかわらず、コードは同じように満足して処理を進めるため、サンプル コードは非常に非現実的です。エラー処理はありません - おそらく、それはエラーの飲み込みです。

コード何をすべきかわからないため、エラーがスローされます。エラーは NPE です。

コード各分岐で何をすべきかを知っている場合、5 つの分岐を記述する必要があります。これが真の循環的複雑度です。循環的な複雑さをなくすことはできません。実際には、それを処理するために 5 つのロジック ブロックを作成する必要があります。しかし、ここまでアクセスするのは通常のケースではありません。

于 2015-11-03T01:34:59.987 に答える
2

Java 8 以降では、Optional.

Optional.ofNullable(foo1)
    .map(f1 -> f1.foo2)
    .map(f2 -> f2.foo3)
    .map(f3 -> (foo4) f3)
    .map(f4 -> f4.getFoo5())
    .ifPresent(f5 -> {
        // Do something with f5.
    });

それぞれmapOptionalを新しいものに変換しますが、ソースとターゲットの値が両方とも null でない場合のみです。任意の時点での null 値Optionalは、安全に無視される空を生成することになります。

于 2015-11-03T01:37:35.500 に答える