2017-04-03 14 views
0

私は、プロパティの数を持つKotlinにデータクラスを持っています。その1つはIDです。しかし、私が実際にコードでcompare関数を使用している場合は、比較するときにこのIDプロパティを除外したいと思います。 compare機能を手動でボイラーメッキする以外は何もできませんか?IDなしのKotlinのデータクラスを比較します

答えて

1

データクラスインスタンスのいずれかでcopy() functionを使用して、 "のプロパティを変更する"のコピーを作成できます。例えば:

data class User(val id: Long, val name: String) 

val a = User(1, "John") 
val b = User(2, "John") 

println(a == b) // false 
println(a.copy(id = b.id) == b) // true 

は、あなたのデータクラスのインスタンスのいずれかのコピーを作成し、idはあなたが効果的にそのプロパティを無視することができますと比較したい他のインスタンスと同じになるように変更します。

両方のデータクラスインスタンスをコピーしてidを共通の値に設定することもできますが、一度だけの比較を行う場合はcopy()の不要な呼び出しになります。

+1

これはまさに私が探していたもののようです。このような比較メソッドをデータクラス自体に1行で実装できます。ありがとう。 – arslancharyev31

1

データクラスは、プライマリコンストラクタで宣言されているプロパティに基づいてequals機能(compareが発生していない)を生成するので、あなたはそれがIDを比較していない場合は、あなたはアウトIDプロパティを移動する必要がありますプライマリコンストラクタの

明示的な部分は、プロパティをクラスの本体に移動する必要がありますが、プライマリコンストラクタでは初期化されないため、varにする必要がありますvalにして、initブロックの既定値に初期化します。これは、2次コンストラクターで割り当てることができないためです)。

あなたがこれを行うことができる方法の例:

data class User(val id: Long, val name: String) 

data class ModifiedUser(val name: String) { 

    var id: Long = 0 

    constructor(id: Long, name: String) : this(name) { 
     this.id = id 
    } 

} 

val u1 = User(1, "John") 
val u2 = User(2, "John") 

println(u1 == u2) // false 

val m1 = ModifiedUser(1, "Sally") 
val m2 = ModifiedUser(2, "Sally") 

println(m1 == m2) // true 

それは、より良いあなたに合った方法を決定するのはあなた次第ですが、多分それだけでは、望ましい結果を得るためにequalsand by implication, hashCode)をオーバーライドするのが最も簡単です少なくとも、これに関連するコードは一度の場所にありますが、上記の解決策はクラスをかなり複雑にする可能性があります。

+0

うわー、これはすべて「等しく」書かないのですか? – voddan

関連する問題