La mejor forma de manejar instancias de objects múltiples

Debido en parte al hecho de que no puedo crear classs de datos sin parameters en Kotlin, uso object s para esos casos, por ejemplo

 sealed class Node { object Leaf : Node() data class Branch(val left:Node, val right:Node) : Node() } 

El problema es que a veces, termino con varias instancias de la class Leaf . Obviamente, esto no debería ocurrir en general, pero ocurre al serializar y deserializar con algunos frameworks y con algunos casos de testing.

Ahora, podría argumentar que debería arreglar esos casos, pero es difícil saber dónde podrían estar, y no siempre es posible o deseable modificar la semántica de deserialization de los frameworks.

Como tal, quiero que todas las instancias de mis object actúen como el mismo valor, al igual que una data class sin parameters (o una case class parameters en Scala).

Mi mejor solución hasta el momento es la siguiente, incluida en cada object que creo que podría enfrentar este problema:

 object SaneLeaf { override fun hashCode() = javaClass.hashCode() override fun equals(other: Any?) = other?.javaClass == javaClass } 

Obviamente, esto es prolijo y propenso a errores, ya que no parece posible abstraer esas implementaciones a una interfaz. Una superclass funcionaría en casos donde el object no necesita extender otra class, pero a menudo no es el caso.

Alternativamente, puedo crear una class de datos con un parámetro Nothing . Pero eso parece aún más de un truco.

¿Cómo han lidiado los demás con este problema? ¿Hay planes para agregar hashCode y equals implementaciones a objects que siguen la semántica presunta de esas classs (todas las instancias deben ser iguales / mismas hashCode)?

Creo que tener instancias múltiples de la class subyacente de un object es realmente un problema que debe solucionar, pero hay una solución más simple que le permite tener la semántica de igualdad que describió.

Puede definir una class abstracta que realice la lógica de igualdad y hacer que la class sealed henetworkinge de ella, así:

 abstract class SingletonEquality { override fun equals(other: Any?): Boolean = this::class.objectInstance != null && other?.javaClass == this.javaClass || super.equals(other) override fun hashCode(): Int = if (this::class.objectInstance != null) javaClass.hashCode() else super.hashCode() } 

Y el uso:

 sealed class Node : SingletonEquality() { object Leaf : Node() data class Branch(val left:Node, val right:Node) : Node() } 

Aquí, Leaf henetworkingará la implementación equals de SingletonEquality y se comparará de la manera que desee.

  • Companion Objects en Kotlin Interfaces
  • Error de compilation: Smart Cast para '<tipo>' es imposible, porque '<variable>' es una variable local que se captura mediante un cierre cambiante
  • ¿Se puede usar un método de la class de datos Kotlin equals () sin más modificaciones junto con JPA?
  • No se puede llamar a la function de extensión de kotlin desde Java
  • Kotlin Delegate con MultiDex en Android por debajo de 21
  • BiMap / hashmap bidireccional en Kotlin
  • Error al hacer que Enum sea la key principal en la biblioteca de la database de la sala
  • Los generics en KProperty1.getDelegate ¿son demasiado restrictivos?
  • ¿Cómo actualizo kotlin-js-library a 1.1.3 como ha sido el plugin de kotlin-gradle?
  • Convierta un ArrayMap en ArrayList - Kotlin
  • firebase putfile en kotlin