web-dev-qa-db-ja.com

文字列変数を.equals()を使用して文字列リテラルと比較する場合、アイテムの順序に標準的な方法がありますか?

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

例えば ​​:

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

しかしながら

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

Javaで使用する標準と見なされているのはどのバリエーションですか。なぜですか。

11
BrandonV

これは古いC(またはC++)でプログラミングするときに使用された安全対策に起因していると思います。 Cでは、等しいかどうかをテストするときに誤って値を割り当てる可能性があります。

if (x = 3)

Xが3に等しいことをテストするのではなく、代入xの値が3であるため、この条件は常にtrueになります。この微妙なバグを回避するために、開発者は条件を逆にし始めました。

if (3 = x)

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

より最近の言語にはこの問題はなく、このようなことを行おうとすると簡単に警告することができます。そのため、それはあまり純粋な好みではないので、1つを選択して、それを一貫して使用します。

3
Oleksi
  • 標準的で良い習慣は、あなたが働いている組織の文化によって異なります

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

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

1
CodeART

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

そうは言っても、文字列リテラルを埋め込むのではなく、より良いオプションはおそらくこれです:

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

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

0