2017-04-03 32 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

相关问题