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 
  • Mocktito ArgumentCaptor para Kotlin lambda con arguments
  • string array literal? ¿Cómo lo codigo simplemente?
  • KClass de reference sin resolver tratando de usar DBFlow y Kotlin con Android
  • ¿Cómo anular el método setter en kotlin?
  • Cómo usar con envoltorios pnetworkingeterminados?
  • Observables opcionales en combinar
  • La interoperabilidad Varargs Kotlin Java no funciona correctamente
  • AspectJ Problemas del comstackdor con la delegación de kotlin en la jerarquía de types
  • Kotlin Dagger2 no puede encontrar el símbolo ApplicationModule_ProvideApplicationFactory
  • "Código en interfaces" Kotlin, ¿cómo evitan el "diamante mortal de la muerte"?
  • Kotlin lazy default property