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

Kotlin 生成equals()、hashCode()等时忽略某些属性,kotlin,Kotlin,假设我有一个数据类,它有三个属性: 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 (oth

假设我有一个数据类,它有三个属性:

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)
}

那么,如果我不想在
equals()
hashCode()中使用
id
,该怎么办呢?有没有办法告诉Kotlin在生成这些函数时忽略某些属性?对于数据类,这些函数是使用主构造函数中声明的所有属性生成的。从:

编译器自动从所有 在主构造函数中声明的属性:

  • 等于()/hashCode()对
  • toString()的形式为“User(name=John,age=42)”
  • 与中的属性相对应的componentN()函数 他们的申报顺序
  • copy()函数(见下文)
如果希望在实现时不考虑属性,则必须将其移出主构造函数,或者自己实现这些函数


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

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

编译器自动从所有 在主构造函数中声明的属性:

  • 等于()/hashCode()对
  • toString()的形式为“User(name=John,age=42)”
  • 与中的属性相对应的componentN()函数 他们的申报顺序
  • copy()函数(见下文)
如果希望在实现时不考虑属性,则必须将其移出主构造函数,或者自己实现这些函数


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

对我来说行之有效的解决方案是将元数据与数据分开。e、 g:

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

对我来说,一个行之有效的解决方案是将元数据与数据分开。e、 g:

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

来自文档:

请注意,编译器仅使用主构造函数中为自动生成的函数定义的属性。要从生成的实现中排除属性,请在类主体中声明它

您的示例必须如下所示:

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

有关更多信息,请参阅文档中的:

请注意,编译器仅使用主构造函数中为自动生成的函数定义的属性。要从生成的实现中排除属性,请在类主体中声明它

您的示例必须如下所示:

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

有关更多信息,请查看:

相同的问题,没有好的答案如果您需要自定义
equals()
hashCode(),则可能重复
方法然后你应该将它变成一个常规类,并自己实现它们,而不是一个数据类-这是一个标志,你正试图将
数据类
用于此功能不是为之设计的东西。同样的问题,如果你需要自定义
equals()
hashCode(),没有好的答案可能重复
方法然后您应该将其设置为常规类,并自己实现,而不是数据类-这表明您正试图将
数据类
用于此功能不适用的内容。