2009-09-09 7 views
29

2つのオブジェクトが等しいかどうかを比較し、nullを考慮するメソッドがJDKにありますか?このような何か:nullをチェックする2つのオブジェクトを比較する

public static boolean equals(Object o1, Object o2) 
{ 
    if (o1 == null) 
    { 
     return o2 == null; // Two nulls are considered equal 
    } 
    else if (o2 == null) 
    { 
     return false; 
    } 

    return o1.equals(o2); 
} 

私はそれがどこかにすでに存在していると思うだろうので、この方法を自分で書くことが愚かなようです。

答えて

51

Java 7.0では、新しい便利なクラス:Objectsが追加されました。

それは、このために、正確に方法があります。Objects.equals(Object a, Object b)

+0

Java 7はまだ普遍的に利用可能ではありません。私は一般的に、そのデプロイメントが少なくとも95%に達するまでAPIを使用しないようにしています。 –

+1

@EdwardFalkはい、またJava 7(または他のバージョン)は100%の可用性を達成できません。今日は2015年7月12日、Java 7はちょうど4歳、Java 6は9歳**です。 Java 7でも**寿命末に達しました**ということは、Java 7でも公開アップデートがなくなることを意味します。Java 6.0 APIのみを使用することをお勧めしますか?はい、Java 6.0しかないコンピュータがありますが、個人的には、Java 7と8で追加された機能を放棄して、10年前のシステム用のソフトウェアを開発したくありません。 – icza

+0

はい、それは私の働き方です。ここ数年でJava 6の機能を使い始めたばかりで、Java 7や8の機能はまだ使用していません。私はそのようにすべての人生を歩んできました。私はK&R Cがどこからも利用できなくなるまでAnsi Cを使い始めなかった。私は必要なときに新機能を使用しますが、可能な限り私は自分のコードをコンパイルしてどこでも実行したいと考えています。 –

4

あなたがNullPointerExceptionsが心配している場合は、あなただけのような平等をテストできます:equals()の一般的な契約がnull以外のオブジェクトがnull参照に等しくなることは決してないということです、そしてequals()方法という

if (obj1 != null && obj1.equals(obj2)) { ... } 

をオブジェクトをnull参照(NPEを投げない)と比較する場合は、falseを返す必要があります。

+2

私は他のシナリオでは、ロジックが、ここで私は、特に2つのNULLは等しいと見なされるために(したがって、真の句を実行する)必要を使用しています。これを行うにはかなり冗長でしょう: if((obj1 == null && obj2 == null)||(obj1!= null && obj1.equals(obj2))){...} – dcstraw

+1

これはそれらの1つです目には強く、コモンズランには解決策がある構造体(ヌルと空の文字列をチェックするか、IOExceptionを気にすることなくストリームを閉じるなど)。 – SingleShot

+0

私はSingleShotに同意します。私はこのようなことで頻繁にcommons-langを使います。 –

17

Apache Commons LangのメソッドはObjectUtils.equals(object1, object2)です。あなたはそのような方法でジェネリックを望んでいない、少なくとも一般的な使用では、偽のコンパイルエラーにつながるでしょう。オブジェクトのクラスをチェックしてfalseを返すために、equalsは非常によくわかっています(または契約の一部であるべきです)。したがって、追加の型の安全性は必要ありません。

+0

はい、私はジェネリック医薬品が本当にあなたに何も買わないと思います。あなたはまだ完全に異なる型を渡すことができ、型推論は型パラメータとしてObjectを選択するだけです。私はあなたが参照している "偽のコンパイルエラー"が何ではないか分かりません。 – dcstraw

+0

私は間違いなく一般的なパラメータなどを使って問題を抱えているようなジェネリックの試みを見てきました。私はこのシナリオですぐに再現することができなかったので正しいかもしれませんが、もしそうなら、ジェネリックスは無意味です。何も受け入れないので、なぜObjectを宣言しないのですか? – Yishai

+1

合意。この場合、Objectを使う方が良いでしょう。 – dcstraw

2

私は必要性に遭遇し、「これは非常に一般的なJavaでなければならない」と思うが、見つからないときは、ジャカルタコモンズのプロジェクトをチェックする。それはほとんど常にそれを持っています。 commons-lang API(最も一般的なユーティリティを基本にしています)を簡単に検索すると、あなたが望むものを提供するequals()メソッドが表示されます。

14

FWIW探しているものがあり、これは私の実装だった:私のアプリケーションで

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

、私はaとbが常に同じタイプになることを知っているが、I a.equals()が合理的に実装されていれば、これがうまくいかなくてもうまくいくと思われます。

+2

新しい方法は 'Objects.equals(Object a、Object b)' – tmin

+1

1.7の新機能です。ニース。 –

+0

'return(a == null)? (a == b):a.equals(b); 'あなたがそこにあるものよりもはるかに読みやすいように見えます(たとえ同じオブジェクトに対してequalsを呼び出したとしても)。 – Dukeling

5
public static boolean equals(Object object1, Object object2) { 
    if (object1 == null || object2 == null) { 
     return object1 == object2; 
    } 
    return object1.equals(object2); 
} 
関連する問題