null をチェックするときは、これを使用します。
String str;
if(str == null){
//...
}
しかし、私はこれも見ました:
if(null == str){
//...
}
どちらか一方を使用する利点はありますか?それとも読みやすさを向上させるためですか?
null をチェックするときは、これを使用します。
String str;
if(str == null){
//...
}
しかし、私はこれも見ました:
if(null == str){
//...
}
どちらか一方を使用する利点はありますか?それとも読みやすさを向上させるためですか?
2 番目のバージョン ( null == str
) はヨーダ状態と呼ばれます。
どちらも同じ動作になりますが、2 番目の方法には 1 つの利点があります。変数を忘れたときに、変数を誤って変更することを防ぎます=
。その場合、コンパイラはその行でエラーを返し、コードの奇妙な動作とその結果のデバッグが残ることはありません。
この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...」と言うでしょう。
読みやすさ以外に違いはありません。自分にとって意味のある方を使用してください。
あなたが述べたように、読みやすさが最も重要な理由です。声に出して読むと、 (null == str) がうまく読めません。右から左に読むのとほぼ同じです。(str == null) の方が読みやすいです。
また、次の点も考慮する必要があると思います。
if (str != null)
if (str == null)
対。
if (null != str)
if (null == str)
ポジティブ (str == null) とネガティブが同じ方法で書かれることを期待します。これが、トップ セットを好むもう 1 つの理由です。
本当の違いはありません。ただし、2番目はエラーが発生しにくいと見なされます。最初のケースでは、実行しようとしてもエラーは発生しません。
String str;
if(str = null){
}
これは、通常、条件文では実行しないことです。
また、まずは実情を考えるのもいい習慣です。
if(a==b) {}
は と同じでif(b==a) {}
、b が null の場合も同じです。少なくともJavaでは、機能に関する限り、スタイル/順序の違いにすぎません。
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 には当てはまりません。
一部の開発者は、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 」よりも理にかなっていると思います。