生成equals(),hashCode()等时忽略某些属性

比方说,我有一个数据类有三个属性:

data class Product( val id: Int, val name: String, val manufacturer: String) 

如果我理解正确,Kotlin将会使用所有这三个属性来生成equals()hashCode() ,如下所示:

 override fun equals(other: Any?): Boolean { if (this === other) return true if (other == null || javaClass != other.javaClass) return false val that = other as Product? return id == that.id && name == that!!.name && manufacturer == that.manufacturer } override fun hashCode(): Int { return Objects.hash(id, name, manufacturer) } 

那么,如果我不想在id equals()hashCode()使用id呢? 有没有办法告诉Kotlin在生成这些函数时忽略某些属性? 如何toString()compareTo()

对于数据类,这些函数是使用主构造函数中声明的所有属性生成的。 从官方文档 :

编译器会自动从主构造函数中声明的所有属性中派生下列成员:

  • equals()/ hashCode()对,
  • toString()形式为“User(name = John,age = 42)”,
  • componentN()函数对应于它们的声明顺序的属性,
  • copy()函数(见下文)。

如果你想要一个属性不被考虑到他们的实现,你必须将其移出主构造函数,或者自己实现这些函数。

关于类似问题的更多讨论在这里 。

对我来说运行良好的解决方案是将元数据与数据分开。 例如:

 data class Entity<out T>(val id: Int, val data: T) data class Person(val name: String, val manufacturer: String) 

用法:

 val e1 = Entity(1, Person("Mickey", "Disney")) val e2 = Entity(2, Person("Mickey", "Disney")) val e3 = Entity(3, Person("Donald", "Disney")) e1 == e2 // false e1.data == e2.data // true e2.data == e3.data // false