18

null をチェックするときは、これを使用します。

String str;

if(str == null){
    //...
}

しかし、私はこれも見ました:

if(null == str){
    //...
}

どちらか一方を使用する利点はありますか?それとも読みやすさを向上させるためですか?

4

8 に答える 8

38

2 番目のバージョン ( null == str) はヨーダ状態と呼ばれます。

どちらも同じ動作になりますが、2 番目の方法には 1 つの利点があります。変数を忘れたときに、変数を誤って変更することを防ぎます=。その場合、コンパイラはその行でエラーを返し、コードの奇妙な動作とその結果のデバッグが残ることはありません。

于 2012-06-11T16:01:03.613 に答える
34

このnull == x規則は通常、C に精通した人が作成したコードで見られます。ここでは、代入が式になることもあります。一部の C プログラマーは、次のようなコードを作成=します。

if (NULL == ptr)...

NULL = ptrは有効な割り当てではないため、コードはコンパイルされません。これにより、コードベースにかなり卑劣なエラーが導入されるのを防ぎますが、生成された警告を有効にして読み取るように注意する限り、最新の C コンパイラはそのような規則を時代遅れにします...

このコーディング スタイルは、参照代入をブール式として使用できない Java ではまったく役に立ちませんでした。直感に反するとさえ考えられます。自然言語では、ほとんどの人は「if null is equal to X...」ではなく、「if X is null...」または「if X is equal to 17...」と言うでしょう。

于 2012-06-11T16:00:27.393 に答える
4

読みやすさ以外に違いはありません。自分にとって意味のある方を使用してください。

于 2012-06-11T15:56:41.647 に答える
3

あなたが述べたように、読みやすさが最も重要な理由です。声に出して読むと、 (null == str) がうまく読めません。右から左に読むのとほぼ同じです。(str == null) の方が読みやすいです。

また、次の点も考慮する必要があると思います。

if (str != null)  
if (str == null)

対。

if (null != str)
if (null == str)

ポジティブ (str == null) とネガティブが同じ方法で書かれることを期待します。これが、トップ セットを好むもう 1 つの理由です。

于 2012-06-11T16:00:03.657 に答える
2

本当の違いはありません。ただし、2番目はエラーが発生しにくいと見なされます。最初のケースでは、実行しようとしてもエラーは発生しません。

String str;

if(str = null){
}

これは、通常、条件文では実行しないことです。

また、まずは実情を考えるのもいい習慣です。

于 2012-06-11T16:08:40.393 に答える
2

if(a==b) {}は と同じでif(b==a) {}、b が null の場合も同じです。少なくともJavaでは、機能に関する限り、スタイル/順序の違いにすぎません。

于 2012-06-11T16:00:42.370 に答える
2
if (null == str) {
}

は c/c++ のプログラミング イディオムで、代入演算子=を使用して true/false ステートメントに解決できます。たとえば、c で、c/c++ でストリームを開くことができるかどうかを確認したい場合は、次のことができます。

if (myStream = openStream())

これは、1行で開いて割り当てます。ただし、これは、人々が=意味するときにタイプすることが多いことを意味==し、c では有効な構文になります。たとえばif (x = 5)、本当に意味する場合は、常に true に解決されますif (x ==5)。そのif (5 == x)ため、a を省略した場合=、コードはコンパイルされません。

これは Java には当てはまりません。

于 2012-06-11T16:01:48.890 に答える
1

一部の開発者は、var == nullは よりもエラーが発生しやすいと主張していますnull == var。彼らの主張は、null チェックを行う代わりに、誤って変数を割り当てる可能性があるというものです。

ただし、テストする変数nullが a のBoolean場合にのみ、誤っての=代わりに使用でき、==コンパイルされます。

Boolean checked = Boolean.TRUE;
if(checked = null){ // accidentally assigned null and compiles
}

条件式はブール値に評価される必要があるため、この場合にのみ割り当てがコンパイルされます。JLS-14.9を参照してください。代入式自体がブール型に評価されるため、コンパイルされます。しかしNullPointerException、Java は であるchecked変数のボックス化を解除しようとするため、実行時null

他の型を使用するBooleanと、コンパイラ エラーが発生します。例えば

String str = "hello";
if(str = null){ // compiler error, because str = null doesn't evaluate to a boolean
}

私の結論は、エラーの状況は非常にまれであり、そのようなエラーを検出する単体テストを簡単に作成できるということです。

そのため、if ステートメントをより読みやすい方法で記述します。

「 if name is null 」は「 if null is name 」よりも理にかなっていると思います。

于 2015-09-11T05:44:47.087 に答える