2017-03-23 9 views
-1

私は、私のアプリで2つの異なる方法でデータをオブジェクトに埋め込むというような問題があります。 時には、2番目のフィールドにはいくつかのヌルフィールドがあることがあります。 私はこれらの2つのオブジェクトを比較したいと思います.1つのオブジェクトにnull値のフィールドがある場合、このフィールドは比較対象から除外されます。 誰かが実際にそれをどうやって考えていますか? 私にとって最善の方法は、InteliJのequals()とhashCode()、...ジェネレータで行うのと同じように、コードをgenereteするために使用するpseudoEquals()メソッドテンプレートです。 または一部マッチャーを使用するが、私はものを見つけられませんでした:/2つのオブジェクトを比較するときにnullフィールドを除外する方法は?

class A { 
T f1; 
T f2; 
T f3; 
} 

A a1 = new A(value1, value2, value3); 
A a2 = new A(value1, null, value3); 

a1.pseudoEquals(a2) =>真

だから私はこのような何かを生成することができるようにInteliJにジェネレータテンプレートを持っているしたいと思います:

public boolean pseudoEquals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 
     if (f1 == null && f2 == null && f3 == null) return false; 

     A that = (A) o; 
     if (that.f1 == null && that.f2 == null && that.f3 == null) return false; 

     if ((f1 != null && that.f1 != null) && !f1.equals(that.f1)) return false; 
     if ((f2 != null && that.f2 != null) && !f2.equals(that.f2)) return false; 
     if ((f3 != null && that.f3 != null) && !f3.equals(that.f3)) return false; 

     return true; 
    } 

誰でも私にそのようなテンプレートを作成する方法を示すことができますか、それとも誰かがそれを持っていますか? :) ありがとうございます。

+0

[オブジェクトがJavaでnullかどうかを確認する方法](http://stackoverflow.com/questions/15800738/how-to-check-if-object-is-null-in-java) –

+0

@山本さん - あなたが追加した質問と重複していません。 しかし、なぜこのコードがテンプレートとして必要なのですか? 2つ目は、Javaが明示的に使用する方法を知っているオブジェクトのequal()メソッドとして実装する必要があります。 –

+0

@h__ - それはjava.inの質問の基本です。彼は2つのオブジェクトを比較するときにnullフィールドを除外する方法を尋ねます。これはJavaでフィールドのcheck null値と同じです。 –

答えて

0

まず、なぜこれをやりたいのですか? pseudoEquals()があなたが本当に解決しようとしている問題の最良の解決策であるかどうかについて二度考えてみてください。あなたはあなたの考えを分かち合いたいと思うかもしれません、あなたに示唆を与えるために多くの華麗な心があります。

あなたが言っていることを意味するなら、ちょっとした補助クラスの問題ではないのですか?今で

public class MyObjects { 
    public static boolean equalIfNotNull(Object attr1, Object attr2) { 
     return attr1 == null || attr2 == null || attr1.equals(attr2); 
    } 
} 

pseudoEquals()あなたは

 return MyObjects.equalIfNotNull(f1, that.f1) 
       && MyObjects.equalIfNotNull(f2, that.f2) 
       && MyObjects.equalIfNotNull(f3, that.f3); 

編集行うことができます。MyObjects.pseudoEqual(this, that, A::getF1, A::getF2, A::getF3)

  • あなたは可変引数とメソッドの参照と、それは、よりエレガントに可能性があります。より多くの考えを。
  • リフレクションマジックを使用して、クラスのすべてのインスタンスフィールドを検出し、必要なロジックを実行できます。

もちろん、必要に応じて、コードを生成するIntelliJ IDEA用のプラグインを作成することもできます。過労かもしれない?

+0

ありがとうございます。私はジェネレータを好むでしょう、私は多くのDTOを持っています、時には多くのデータメンバーです。だから私はそのように試してみるつもりです。 – user7017392

関連する問題