2

この同等性の比較を実装するにはどうすればよいですか?

boolean x = (a == b) || (a.equals(b))

両方のオブジェクトのコンテンツが等しいことを確認したいのですが、nullも問題ありません。つまり、両方がnullになる可能性があるため、等しくなります。

更新:明確にするために、私はこの比較を数回実装する必要があり、特に長いオブジェクト名では、毎回このようなものをコピーして貼り付けたくありません。'a'と'b'を使用すると、小さくてシンプルに見えますが、大きくなる傾向があります...このための既存のJava機能が不足していないかどうかを知りたいです。

4

9 に答える 9

9

常に役立つApacheCommonsLang、より正確にはObjectUtils.equals()を確認することをお勧めします。

于 2008-12-03T13:18:51.953 に答える
8

別の方法

boolean x = null==a ? null==b : a.equals(b);
于 2008-12-03T13:24:51.177 に答える
5

aがnullで、bがnullでない場合はどうなりますか?私はあなたが本当に欲しいと思います:

boolean x = (a == null && b == null) || (a != null && a.equals(b))

編集:そのクラスの2つのオブジェクトを受け取り、上記のように比較を行うクラスに静的NullEqualsメソッドを実装して、書き換えを回避し、コードを少しすっきりさせることができます。

public class MyClass {

    public static boolean NullEquals( MyClass a, MyClass b )
    {
         return (a == null && b == null) || (a != null && a.equals(b));
    }
}


if (MyClass.NullEquals(a,b))
{
    ...
}
于 2008-12-03T13:10:28.663 に答える
5

典型的なパターンは次のとおりです。

if (a == b)
{
    return true;
}
if (a == null || b == null)
{
    return false;
}
// Now deal with a and b, knowing that they are non-identical, non-null references

はい、それは冗長ですが、それを独自の方法に分離すると、合理的な管理下に置くことができます。

于 2008-12-03T13:15:42.817 に答える
1

直接的な答えではありませんが、null になる可能性があるかどうかに関係なく多くのオブジェクトがある場合は、コードに何らかの問題があることを示している可能性があります。オブジェクトの不在を表す別の方法であるNull パターンを見てください。

于 2008-12-03T13:49:15.683 に答える
1

どうですか:

boolean x = equals( a, b );

public static boolean equals( Object a, Object b ) {
    if ( a == null && a == b ) {
        return true;
    } else {
        return a == b || a.equals( b );
    }
}

そうねぇ。

  • a が null で a が b の場合は問題ありません
  • a が null でない場合、a == b (同じ ref ) の場合、短絡により true を返します
  • a が b でない場合 (OR の 2dns 部分はおそらく b が null )、 a を返します ( null ではない ) .equals( b ) b が何であれ

うん、覆われています。

于 2008-12-04T01:30:31.867 に答える
0

パフォーマンス上の理由から、通常、質問で行われたように、他のロジックを実行する前にIDを確認することをお勧めします。ただし、回答の多くはこれを考慮していません。

IDチェックを行うのに最適な場所は、equalsクラスのメソッドの実装です。

public boolean equals(Object obj) {
  if(this == obj) return true;
  ...
}

これが実行できる/実行できる場合は、比較を簡単に実行できます。

a == null ? b == null : a.equals(b);

それ以外の場合は、自分でIDを確認する必要があります。

a == null ? b == null : (a == b || a.equals(b));
于 2008-12-04T01:07:55.827 に答える
0

それを行う最も一般的な方法は次のとおりです。

a==null ? b==null : a.equals(b)

潜在的にわずかに効率的ですが、あまり明確ではない式は次のとおりです。

a==b || (a!=null && a.equals(b))

もちろん、これをメソッド内に入れることができます。

public static boolean eq(Object a, Object b) {
     return a==b || (a!=null && a.equals(b));
}

aがnullでbがnullでない場合は、元の質問コードNPEに注意してください。

于 2008-12-03T14:54:02.463 に答える
0

コメントを追加できません。これをJon Skeetの回答へのコメントとして扱います。

Java で Null = Null を true または false にします。

より具体的には、Null = Null を処理する必要があり、異なる言語がこのケースをどのように、なぜ処理するのか?

于 2008-12-03T13:57:04.543 に答える