Java には 2 種類の等価性があることを常に理解しています。
- value equality :
.equals()
メソッドを使用して、2 つのオブジェクトが null 以外のオブジェクト参照で等価関係を実装していることをテストします。 - reference equality :
==
演算子を使用して、2 つのプリミティブ型またはメモリ位置が等しいことをテストします。
次のページでは、これらの言語の基礎について詳しく説明します。
- Java プログラミング : Java プログラミング/オブジェクトの比較
- xyzws Java EE FAQ :等価演算子と equals メソッドの違いは何ですか?
- Java プラットフォーム API : Object.equals() の Javadoc
- Java 言語仕様 :等価演算子
null
これらのリンクのいずれも明示的に指定していないのは、2 つのオブジェクト参照が値の等価性について比較された場合にどうなるかです。NullPointerException
をスローする必要があるという暗黙の前提がありますが、これはObjectUtils.equals()メソッドによって行われることではありません。これは、ベスト プラクティスのユーティリティ メソッドと見なされる可能性があります。
私が心配しているのは、Apache Commonsがバックドアによって Java に平等の第 3 の手段を効果的に導入したように見え、すでに混乱している状況がさらに複雑になった可能性があることです。値が等しいかどうかをテストしようとし、それが失敗すると参照が等しいかどうかのテストにフォールバックするため、私はこれを 3 番目の等価性の尺度と呼んでいます。Apache Commons の等価性テストは、値の等価性および参照の等価性と多くの類似点がありますが、明らかに異なります。
心配して、可能な限り使用を避けたいと思うのは正しいObjectUtils.equals()
ですか?
ObjectUtils.equals()
他の 2 つの平等の尺度の有用な結合を提供すると主張する議論はありますか?
選ばれた答え
この質問について意見が一致しているようには見えませんが、私は Bozho の意見を正しいとマークすることにしました。問題を隠ぺいしようとするのではなく、2 つの null オブジェクトの値が等しいかどうかを比較する根本的な原因に対処するフェイルファストコードを作成する必要があります。