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.

  • Kotlin y Proguard
  • Función de logging de extensión Kotlin con logback (slf4j)
  • ¿Cómo se puede networkingucir el tamaño del video en el momento de la grabación, Android?
  • Incluye el logging en el operador de Elvis?
  • Corutinas de testing unitaria en el hilo de UI
  • La delegación de propiedad kotlin alias lanza Exception
  • ¿Hay alguna manera de cambiar mi método a la stream Observable que será una cadena de modificadores?
  • En android kotlin utilizando la biblioteca paso a paso pasando los valores de botones de opción personalizados sobre múltiples fragments para ser usados ​​en una página de resumen
  • Setter no pidió Kotlin POJO
  • ¿Por qué esta testing de instrumentación de Android invoca actividad en Crear dos veces?
  • Kotlin Dagger 2 no puede proporcionar Interactor