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 hacer una llamada a procedimiento remoto (RPC) tipo seguro en Kotlin?
  • No puede abrir el proyecto después de actualizar Android Studio
  • ¿Cómo crear una llamada asincrónica utilizando modificaciones y observaciones en Kotlin?
  • Crear un caching de ehcache en Kotlin
  • La installation del proyecto Kotlin para Android falla con INSTALL_FAILED_DEXOPT
  • Diferencia entre el método takeWhile () y filter () en Kotlin
  • El color de background de la image del elemento de Android ListView no cambia
  • Crear un propio DataSource con properties de resorte
  • Errores de compilation de Codename One relacionados con Kotlin
  • ¿Puedo hacer que el constructor pnetworkingeterminado de una class generada a partir de un file Kotlin sea privado?
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?