12

コードを書くとき、null チェックにイライラします。特にデータ構造のコーディング中!

私はそれをしなければなりません

String val;
if(a != null && a.child != null)
    val = a.child.getValue();
else
    val = null;

なんか、こういう...

? のような演算子はありますか。(これは C# の一部です) Java の負担を軽減するには?

С# 例:

String val = a?.child?.getValue();
4

6 に答える 6

9

いいえ

Java のほとんどの場合と同様に、長い道のりをたどる必要があります。ねえ、少なくとももっと読みやすい - null チェックを行う必要がある場合は、明示的で簡単に見えるようにしないでください (ここで悪魔の擁護者を演じます)。

于 2014-11-22T05:47:31.867 に答える
4

ありません。Java の演算子なので、Hari が指摘するように、「長い道のり」の方法で物事を行う必要があります。ただし、 null の使用を思いとどまらせるので、これは良いことであると主張することもできます。

たとえば、OP のコードでnull、またはその子が存在しない場合に val を設定するのはなぜですか? これが関数で、val が返されると仮定しましょう。これはコードのにおいです。コードのユーザーにさらに別の null チェックの要件をプッシュするだけです。 これは、null チェックの無限のサイクルになり、コードを完全に混乱させ、ロジックを混乱させます。メンテナンス プログラマーは、これが正当なロジックであるかどうかを判断できないことが多いためです。 PHP を真似しないでください。. その優れた暴言からの引用:

「無意味なことをしたり、エラーで中止したりすることに直面したとき、それ (PHP) は無意味なことをします。」

PHP は恐ろしい設計上の選択をします。 無意味なことをするよりも、エラーで中止する方がはるかに良いです。

代わりに、次のような質問をする必要があります。

  1. a が null であるとはどういう意味ですか? これはプログラミングエラーですか?その場合は、RuntimeException / IllegalArgumentException をスローします。これが重要なコードであり、「失敗できない」場合は、少なくとも怪しいものを書き留めていることをログに記録してください。そうすれば、修正される可能性があります。
  2. a.child.getValue() 自体が null を返す場合はどうなりますか? 呼び出し元は、その null と "a または child is null" null の違いをどのように伝えますか? 彼らはできません
  3. 適切なデフォルト値がある場合は、それを使用してください。Collection または Array を使用している場合は、「空」を意味する null を渡さないでください。emptyListなどのCollections.emptyXXX()、または空の配列を渡します。String を null に設定する代わりに、空の string に設定することを検討してください""。ところで、これにより、hashCode(), equals(), and compareTo()はるかに簡単になります!
  4. Null オブジェクト パターンを使用します。. a が Foo のインスタンスである場合、値自体が「nullish」(null または "") である子を持つ static final Foo.NULL を定義します。

時には、これらのことのどれも本当にできないことがあります。引数が null になる正当な理由があるか、以前の不適切な設計またはサード パーティ ライブラリとの下位互換性を確保する必要があります。IMO、これはまれなはずであり、何が起こるかを文書化する必要があります。そして、これを反映するために null (または 0) 以外の何かを返す必要があるかもしれません。例えば

/**
   countPeople
   @param  node  null means the foobar can't connect to the database, 
   @return       Foobar.ERR_NO_DB if node is null
*/

OPの例では、ある種のXMLノードである可能性があり、Java XMLインターフェースは巨大であり、そのうちの1つに適切なNULLオブジェクトを作成することは非常に困難です。(うーん、ちょっといいオープン ソース プロジェクトかも?)。ただし、その場合、a.child.getValue()多くの電話をかける可能性があります。これを処理し、null を処理するための小さなユーティリティ関数を記述します。どこでも長々とした null チェックの代わりに、少なくともそれらはいくつかのユーティリティ メソッドにカプセル化されています。ドライ。そして、間違いなく、チェックが長引いているという事実が、より良い設計を行うことを後押ししました。だから、?の欠如。オペレーターは良かったですよね?:-)

于 2014-11-22T16:27:21.937 に答える
1

いいえ、ありません。JAVA の演算子。!= 演算子を使用して、null でないことを確認できます

String val = (a != null && a.child !== null) ? a.child.getValue() : null; 
于 2014-11-22T06:08:26.393 に答える