web-dev-qa-db-ja.com

object == nullまたはnull == object?

null == objectobject == null checkよりも優れていると誰かから聞いた

例:

void m1(Object obj ) {
   if(null == obj)  // Is this better than object == null ? Why ?
       return ;
   // Else blah blah
}

何か理由はありますか、これは別の神話ですか?手伝ってくれてありがとう。

94
Jijoy

これはおそらく、Cから学んだ習慣であり、この種のタイプミスを避けるためです(二重=の代わりに単一==):

if (object = null) {

Javaでは、==の左側に定数を置くという規則は、Javaではifの式がboolean値に評価される必要があるため、実際には役に立ちません。 booleanである場合、引数を入力するとコンパイルエラーが発生します。 (そして、それがブール値である場合、とにかく==を使用すべきではありません...)

134

他の人が言ったように、タイプミスを避けるためにCから学んだ習慣です-Cでさえ、警告を与えるのに十分な高い警告レベルでまともなコンパイラを期待していますが。 Chandruが言うように、Javaのnullとこの方法で比較すると、Boolean型の変数を使用している場合にのみ問題が発生します(サンプルコードには含まれていません)。これは非常にまれな状況であり、他の場所でコードを記述する方法を変更する価値がある状況ではないと思います。 (この場合でも、オペランドを逆にすることはありません。それらを逆にすることを検討するのに十分明確に考えているなら、等号を数えることができると確信しています。)

has n'tが言及されているのは、多くの人々(私自身も含めて)がif (variable == constant)フォームをより読みやすいと感じることです-それはあなた自身を表現するより自然な方法です。これがnotからCから慣習を盲目的にコピーする理由です。ある環境で役立つかもしれないものが別の環境で役立つと仮定する前に、(ここでやっているように)常にプラクティスに質問する必要があります。

31
Jon Skeet

これは、オブジェクトのタイプがBooleanの場合を除いて、Java(1.5+)ではあまり価値がありません。その場合、これはまだ便利です。

if (object = null)は、オブジェクトがBooleanの場合、Java 1.5+でコンパイルエラーを引き起こしませんが、実行時にNullPointerExceptionをスローします。

27
Chandra Sekar

Javaには正当な理由はありません。

他のいくつかの答えは、それが平等ではなく誤って割り当てられる可能性があるためだと主張しています。しかし、Javaでは、ifにブール値が必要なので、次のようにします。

if (o = null)

コンパイルしません。

Javaでこれが問題になるのは、変数がブール値である場合のみです:

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality
9

これも密接に関連しています:

if ("foo".equals(bar)) {

nPEに対処したくない場合に便利です。

if (bar!=null && bar.equals("foo")) {
7
cherouvim

このトリックは、v = nullのタイプミスを防ぐためのものです。

しかし、Javaでは、if()条件としてブール式のみが許可されているため、トリックはあまり意味をなさないため、コンパイラはこれらのタイプミスを検出します。

ただし、C/C++コードにとっては依然として貴重なトリックです。

5
vava

これは、左側に定数があることを好む人向けです。ほとんどの場合、左側に定数があると、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
3
SPee

同じ理由で、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が勝者です。

2
Avinash

commutative property のため、object == nullnull == objectYodaバージョン )の唯一の違いは認知的性質:リーダーによるコードの読み取りおよびダイジェスト方法。決定的な答えはわかりませんが、他の何かを私が調べているオブジェクトと比較するよりも、私が調べているオブジェクトを他の何かと比較することを個人的に好むことは知っています、それが理にかなっている場合。件名から始めて、次に比較する値。

他のいくつかの言語では、この比較スタイルがより便利です。

一般的に「=」記号の欠落を防ぐために、null == objectの記述は defensive programming の見当違いの行為だと思います。この特定のコードを回避するより良い方法は、junitテストで動作を保証することです。 「=」が欠落する可能性のある間違いは、メソッドの入力引数に依存しないことを忘れないでください-他の人によるこのAPIの正しい使用に依存しないので、代わりにjunitテストはそれに対する安全な保護に最適です。とにかく、動作を検証するためにjunitテストを作成します。欠落している「=」は自然にスコープ内に収まります。

1
Benny Bottema

別様に依田条件書です

Javaで

String myString = null;
if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer

ヨーダコンディション

String myString = null;
if ("foobar".equals(myString)) { /* ... */ } // will be false 
0
Tanmay Naik