21

equalsメソッドでは、このようなものはかなり面倒で醜いものです。

if (field == null)
{
    if (other.field != null)
        return false;
}
else if ( ! field.equals(other.field))
    return false;

C#では、これを行うことができました:

if( ! Object.Equals(field, other.field))
    return false;

Javaに似たようなものはありますか、またはこの種の場合に推奨される方法は何ですか?

4

9 に答える 9

47

Java 7 はjava.util.Objects.equalsを提供します。

于 2011-10-25T14:55:50.473 に答える
25

commons-lang を使用:

org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)

ソースコード:

public static boolean equals(Object object1, Object object2) {
    if (object1 == object2) {
        return true;
    }
    if ((object1 == null) || (object2 == null)) {
        return false;
    }
    return object1.equals(object2);
}

アパッチから

http://commons.apache.org/lang/

これは、C# で行うこととほぼ同じです。

于 2011-10-25T13:27:11.030 に答える
5

これを行うGuava equal

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

またはnull オブジェクト パターン

Guava には、いくぶん関連する比較チェーンと、その他の優れた機能もあります。

于 2011-10-25T13:29:36.480 に答える
4

私なら次のように書きます。

return field != null && other.field != null && field.equals(other.field);

これは C# コード行ほどエレガントではありませんが、投稿した if ツリーよりもはるかに短いです。

于 2011-10-25T13:27:33.883 に答える
2

技術的にすべての回答を受け入れます。実際には、私が管理しているコードではそれらのいずれも使用しません。これは、提供されているすべてのソリューションが中核的な問題である null 値を回避しているためです。コアモデルをNULL値から解放してください。この場合、質問は時代遅れです。

サード パーティのライブラリなどのシステム境界では、null 値を処理する必要がある場合があります。これらは、コア モデルの意味のある値に変換する必要があります。そこで、与えられた解決策が役に立ちます。

Oracle が equals-Methods を null セーフにすることを推奨している場合でも、それについて考えてみてください。null 値を受け入れると、モデルは脆弱になります。equals メソッドは、null をチェックする最後のメソッドではありません。メソッド呼び出し階層で null チェックを管理する必要があります。メソッドはそのままでは再利用できない場合があります。まもなく、すべてのパラメーターが null かどうかがチェックされます。

私は両面を見ました:

一方では、null チェックでいっぱいのコード、もう 1 つのパラメーターを信頼しないメソッド、null チェックを忘れることを恐れる開発者などがあります。

一方、NullPointerExceptions を恐れずに使用できる完全に機能するオブジェクトを持つ明確なアサーションを行う、完全な表現力のあるステートメントを含むコード。

于 2015-07-23T19:33:38.430 に答える
1

実際には、誰もがこれを行う独自の方法に従います。また、ここで groovy を紹介したいと思います。

1つの方法があります

field == null ? false : true;// したがって、基本的に null でない場合は true を返します。

Groovy には、オブジェクトのヌルセーフ演算子があります。クラスの例を見てみましょう

A { 
 String name = "test1"
String surName = "test2"

public String returnName() {

 return name + surName
}

}

A a = null a?.name // 言及された演算子?は、実際に a かどうかをチェックしnullます。次に、名前を呼び出します。

注:これはgroovyでは必要ないため、コードにセミコロンを適用しませんでした。

于 2015-08-06T06:39:45.450 に答える
0

クラスに toString が実装されている場合、 String.valueOf() はこれらの問題のいくつかを解決します。ポインターが null の場合は、toString() の応答または「null」を吐き出します。

于 2011-10-25T13:26:20.040 に答える