.equals()を使用して文字列変数を文字列リテラルと比較する場合、アイテムの順序に標準的な慣行はありますか?[閉まっている]


11

それぞれに利点があり、違いを理解していますが、ベストプラクティス/標準プラクティスは何ですか?なぜ?

例えば ​​:

"myString".equals(myStringVar)
  • 潜在的なNPEを回避し、nullチェックを必要としません。(良いこと?)
  • nullチェックが必要ないため、読みやすくなります。
  • nullが予期される値でない場合、プログラムは賢明でなくても壊れている可能性があります。

しかしながら

myStringVar.equals("myString")
  • nullが期待値である場合、nullチェックが必要です。(良いこと?)
  • nullチェックで複合条件を乱雑にすることができます。
  • NPEが何かが壊れているかどうかを知らせることができます。

Javaで使用する標準と見なされるバリエーションはどれですか?


2
nullが期待される値であるかどうかにかかわらず、「等しい」操作はこれが問題であると判断する場所である必要がありますか?
マシューフリン

私はそうは思いません。しかし、それは私の意見です。他の人の理論的根拠を聞きたいです。
BrandonV

割り当て/比較に=および/または==を使用する言語では、通常、変更できないものを左側に配置して、比較するつもりで誤って割り当てられないようにすることをお勧めします。.equalsのようなオブジェクトでメソッドを使用する言語の場合、それは重要ではないと思います。
-GordonM

回答:


3

これは、古いC(またはC ++)でプログラミングする際に使用される安全上の予防策に起因すると思われます。Cでは、等価性をテストする場合に誤って値を割り当てることができます。

if (x = 3)

xが3に等しいことをテストするのではなく、割り当てxaの値が3であるため、この条件は常に真になります。

if (3 = x)

これには同じ「バグ」が含まれていますが、コンパイラエラーが生成されるため、より安全です。

最近の言語ではこの問題は発生しません。これらの種類のことをしようとすると、簡単に警告することができます。そのため、純粋な好みではないため、1つを選択して一貫して使用してください。


-1これは、のJava規約の理由ではありませんequals。Cとは異なり、Javaの問題は、nullのx.equals(y)場合に式がNPEをスローすることxです。文字列リテラルが"something"あり、大文字と小文字nullを「等しくない」と見なしたい場合は、nullになる可能性がある"something".equals(y)かどうかわからない場合に記述するのが理にかなっていyます。これによりNPEがスローされることはありません。
アンドレスF.

1
  • 標準および優れた実践は、あなたが働いている組織の文化によって異なります

  • .NETの私たちの標準は、myStringVar == "myString"単に私たちがそれに同意したからです。つまり、私たちはそれがクリーンで簡潔であると信じています

注:==オブジェクト自体ではなく参照を比較するため、これはJavaには適用されません。Javaではを使用する必要がありますmyStringVar.equals("myString")


3
少なくともJavaでは、==オブジェクト参照のみを比較するため、使用しないでください。とは言うものの、集合に対する+1-慣習はしばしば物事の「正しい」方法を定義します。
マイケルK

これを指摘してくれてありがとう!答えを更新しました:)
CodeART

@CodeWorks:マイケルの主張を逃したと思います。また、JavaではなくJavaです。
アマラ

質問は、「しかし、何がベスト/標準的なプラクティスと考えられていますか?私の答えは、標準とベストプラクティスは組織ごとに異なるということです。あなたはそれに反対しますか?
-CodeART

@CodeWorks:それに異議を唱える人はいません、CodeWorks。しかし、誰もがmyStringVar == "myString"Java については非常に悪い考えであることに同意することができます(myStringVarインターンが絶対に確実でない限り)。
アマラ

0

変数のnullnessセマンティクスに依存するという点であなたは正しいと思います。nullであると思わず、チェックして処理する必要がない場合は、最初のフォームがきれいです。

とは言っても、文字列リテラルを埋め込むよりも、おそらく次のような選択肢があります。

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

特に、複数の場所で文字列を使用する可能性がある場合。


2
-1:実際には良くない。通常ごくわずかな値でクラッタを追加します
アマラ

@sparkleshy-そうではありません。コードロジックに文字列リテラルを散在させたくないのです。元の答えで述べたように、文字列リテラルが複数の場所で使用されている場合、それらをリファクタリングすることを明確に言います。
ベンジャミンウートン

それを言うには、Pythonでは基本的に識別子は文字列リテラルであるため、Pythonを完全にdissする必要があります。そして、私たちは皆、pythonが素晴らしい言語であることに同意しなければならないと思います。
アマラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.