2017-04-03 20 views

回答

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塊中的默認值,因爲那樣您無法在次構造函數中將其分配給它)。

的你如何能做到這樣的一個例子:

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

哇,這一切都不寫'equals'? – voddan

相關問題