null == object
はobject == null
checkよりも優れていると誰かから聞いた
例:
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
何か理由はありますか、これは別の神話ですか?手伝ってくれてありがとう。
これはおそらく、Cから学んだ習慣であり、この種のタイプミスを避けるためです(二重=
の代わりに単一==
):
if (object = null) {
Javaでは、==
の左側に定数を置くという規則は、Javaではif
の式がboolean
値に評価される必要があるため、実際には役に立ちません。 boolean
である場合、引数を入力するとコンパイルエラーが発生します。 (そして、それがブール値である場合、とにかく==
を使用すべきではありません...)
他の人が言ったように、タイプミスを避けるためにCから学んだ習慣です-Cでさえ、警告を与えるのに十分な高い警告レベルでまともなコンパイラを期待していますが。 Chandruが言うように、Javaのnullとこの方法で比較すると、Boolean
型の変数を使用している場合にのみ問題が発生します(サンプルコードには含まれていません)。これは非常にまれな状況であり、他の場所でコードを記述する方法を変更する価値がある状況ではないと思います。 (この場合でも、オペランドを逆にすることはありません。それらを逆にすることを検討するのに十分明確に考えているなら、等号を数えることができると確信しています。)
has n'tが言及されているのは、多くの人々(私自身も含めて)がif (variable == constant)
フォームをより読みやすいと感じることです-それはあなた自身を表現するより自然な方法です。これがnotからCから慣習を盲目的にコピーする理由です。ある環境で役立つかもしれないものが別の環境で役立つと仮定する前に、(ここでやっているように)常にプラクティスに質問する必要があります。
これは、オブジェクトのタイプがBoolean
の場合を除いて、Java(1.5+)ではあまり価値がありません。その場合、これはまだ便利です。
if (object = null)
は、オブジェクトがBoolean
の場合、Java 1.5+でコンパイルエラーを引き起こしませんが、実行時にNullPointerException
をスローします。
Javaには正当な理由はありません。
他のいくつかの答えは、それが平等ではなく誤って割り当てられる可能性があるためだと主張しています。しかし、Javaでは、ifにブール値が必要なので、次のようにします。
if (o = null)
コンパイルしません。
Javaでこれが問題になるのは、変数がブール値である場合のみです:
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
これも密接に関連しています:
if ("foo".equals(bar)) {
nPEに対処したくない場合に便利です。
if (bar!=null && bar.equals("foo")) {
このトリックは、v = null
のタイプミスを防ぐためのものです。
しかし、Javaでは、if()
条件としてブール式のみが許可されているため、トリックはあまり意味をなさないため、コンパイラはこれらのタイプミスを検出します。
ただし、C/C++コードにとっては依然として貴重なトリックです。
これは、左側に定数があることを好む人向けです。ほとんどの場合、左側に定数があると、NullPointerExceptionがスローされなくなります(または別のnullcheckが発生します)。たとえば、Stringメソッドのequalsはnullチェックも行います。左側に定数があると、追加のチェックを記述できなくなります。これは、別の方法でも後で実行されます。左側にヌル値があるということは、一貫しているだけです。
好む:
String b = null;
"constant".equals(b); // result to false
b.equals("constant"); // NullPointerException
b != null && b.equals("constant"); // result to false
同じ理由で、Cでそれを行います。割り当ては式であるため、誤って=
の代わりに==
を使用した場合に上書きできないように、リテラルを左側に配置します。
次のコードと比較してください。
String pingResult = "asd";
long s = System.nanoTime ( );
if ( null != pingResult )
{
System.out.println ( "null != pingResult" );
}
long e = System.nanoTime ( );
System.out.println ( e - s );
long s1 = System.nanoTime ( );
if ( pingResult != null )
{
System.out.println ( "pingResult != null" );
}
long e1 = System.nanoTime ( );
System.out.println ( e1 - s1 );
null != pingResult
325737
pingResult != null
47027
したがって、pingResult != null
が勝者です。
commutative property のため、object == null
とnull == object
( Yodaバージョン )の唯一の違いは認知的性質:リーダーによるコードの読み取りおよびダイジェスト方法。決定的な答えはわかりませんが、他の何かを私が調べているオブジェクトと比較するよりも、私が調べているオブジェクトを他の何かと比較することを個人的に好むことは知っています、それが理にかなっている場合。件名から始めて、次に比較する値。
他のいくつかの言語では、この比較スタイルがより便利です。
一般的に「=」記号の欠落を防ぐために、null == object
の記述は defensive programming の見当違いの行為だと思います。この特定のコードを回避するより良い方法は、junitテストで動作を保証することです。 「=」が欠落する可能性のある間違いは、メソッドの入力引数に依存しないことを忘れないでください-他の人によるこのAPIの正しい使用に依存しないので、代わりにjunitテストはそれに対する安全な保護に最適です。とにかく、動作を検証するためにjunitテストを作成します。欠落している「=」は自然にスコープ内に収まります。
別様に依田条件書です
Javaで
String myString = null;
if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer
ヨーダコンディション
String myString = null;
if ("foobar".equals(myString)) { /* ... */ } // will be false