web-dev-qa-db-ja.com

等しい前にヌルチェックを防ぐ方法

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に似たようなものはありますか、それともこの種のことを行うための好ましい方法は何ですか?

18
Svish

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);
}

Apacheから

http://commons.Apache.org/lang/

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

24
Lukas Eder

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

41
pholser

Guava equal これはこれを行います:

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

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

グアバには、いくらか関連する 比較チェーン と他の負荷 グッズ もあります。

6
NimChimpsky

私はそれをこのように書くでしょう:

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

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

4
HefferWolf

私はすべての答えを技術的に受け入れます。提供されているすべてのソリューションがコアの問題であるnull値を回避しているため、実際には、制御下にあるコードではそれらを使用しません。コアモデルにNULL値がないようにしてください。この場合、質問は廃止されます。

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

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

私は両側を見ました:

一方では、nullチェックでいっぱいのコード、単一のパラメーターを信頼しなくなったメソッド、およびnullチェックを忘れることを恐れる開発者。

反対側では、NullPointerExceptionsを恐れることなく使用できる完全に機能するオブジェクトを持つことを明確にアサーションする完全な表現ステートメントを含むコード。

2
oopexpert

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

1つの方法があります

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

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

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

public String returnName() {

 return name + surName
}

}

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

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

1
Ashay Jain

プロジェクトコインの一部として、一連の null-safe operator をJavaに追加する提案がありました。悲しいことに、彼らはそれをJava 7に入れませんでした、多分彼らはJava 8に現れるでしょう。 ここ は一般的ですそれらがどのように機能するかについての考え

1
Óscar López

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

0
Thom

オブジェクト参照をチェックするときは==演算子を使用します。両方の参照が同じオブジェクトを参照している場合は、trueを返します。それ以外の場合、オブジェクトコンテンツを探している場合は、オブジェクトの.equalsメソッドを使用してください。

したがって、nullは、ヒープにメモリ位置が指定されていないことを意味します。したがって、「==」演算子で簡単に確認できます。

0
Ankur Mahajan