Ignorar ciertas properties al generar equals (), hashCode (), etc.

Digamos que tengo una class de datos que tiene tres properties:

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

Si entiendo correctamente, Kotlin generará equals() y hashCode() usando todas las tres properties, que serán como:

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

Entonces, ¿qué ocurre si no deseo que se use id en equals() y hashCode() ? ¿Hay alguna manera de decirle a Kotlin que ignore ciertas properties al generar estas funciones? ¿Qué tal toString() y compareTo() ?

Para las classs de datos, estas funciones se generan utilizando todas las properties que se declaran en el constructor primario. De la documentation oficial :

El comstackdor deriva automáticamente los siguientes miembros de todas las properties declaradas en el constructor primario:

  • par igual () / hashCode (),
  • toString () del formulario "Usuario (nombre = Juan, edad = 42)",
  • funciones componentN () correspondientes a las properties en su order de statement,
  • la function copy () (ver a continuación).

Si desea que una propiedad no se tenga en count para su implementación, deberá moverla fuera del constructor principal o implementar estas funciones usted mismo.

Más discusión sobre un problema similar aquí .

Una solución que me ha funcionado es separar sus metadatos de sus datos. p.ej:

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

Uso:

 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 
  • ¿Cómo definir properties propias para models basados ​​en Jena?
  • ¿Cuál es la diferencia entre properties y parameters en Kotlin?
  • Cómo condicionar la comprobación como i <J in para loop kotlin
  • Atributo Kotlin RuntimeInvisibleParameterAnnotations: MyType (String)
  • kotlin 1.1.4 primitivas en class genérica
  • package de caja de serpiente detekt
  • En Kotlin, ¿cómo integro una promise de Kovenant con las respuestas asincrónicas de Elasticsearch?
  • Problema de tipo de habitación de Android
  • Kotlin - TypeCastException en view.getTag ()
  • Cómo depurar el error "No se pudo resolver com.google.android:android" en Anko
  • Gradle 3.0.0-alpha1 no es compatible con el plugin de kotlin-android 1.1.2-3?