nullのチェックで2つのオブジェクトを比較します
-
05-07-2019 - |
質問
JDKには、2つのオブジェクトが等しいかどうかを比較し、NULLを考慮に入れるメソッドがありますか?このようなもの:
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);
}
このメソッドを既にどこかに存在している必要があると思うので、このメソッドを自分で記述するのはばかげているようです。
解決
Java 7.0は、新しい便利なクラスを追加しました: Objects
。
このためのメソッドがあります: Objects.equals(Object a、Object b)
他のヒント
Apache Commons Langには次のようなメソッドがあります: ObjectUtils.equals(object1、object2)。このようなメソッドのジェネリックは必要ありません。少なくとも一般的には、偽のコンパイルエラーが発生します。 Equalsは、オブジェクトのクラスをチェックしてfalseを返すことを非常によく知っている(またはすべきである-契約の一部である)ため、追加のタイプセーフティは必要ありません。
FWIW、これは私の実装でした:
private static boolean equals(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
私のアプリケーションでは、aとbは常に同じ型であることを知っていますが、a.equals()が合理的に実装されていれば、たとえそうでなくてもうまく動作すると思います。
public static boolean equals(Object object1, Object object2) {
if (object1 == null || object2 == null) {
return object1 == object2;
}
return object1.equals(object2);
}
NullPointerExceptionsが心配な場合は、次のような同等性をテストするだけです:
if (obj1 != null && obj1.equals(obj2)) { ... }
equals()
の一般的な規約は、null以外のオブジェクトがnull参照と等しくなることはなく、 equals()
メソッドはfalseを返すことです。オブジェクトをnull参照と比較する場合(およびNPEをスローしない場合)。
私がニーズに出くわし、「これは非常に一般的なJavaである必要がある」と思うたびに見つからない場合は、ジャカルタコモンズプロジェクトをチェックします。それはほとんど常にそれを持っています。 commons-lang API(最も基本的な共通ユーティリティがある)をすばやく検索すると、必要なものを提供する equals()
メソッド。
ジャカルタコモンズラング APIには、探しているものがあります ObjectUtils。 equals(Object、Object)