Determinar si una instancia es una instancia de una class de datos

Dadas las siguientes classs

abstract class SomeAbstractClass { abstract val name: String } data class DataClass( override val name: String ) : SomeAbstractClass() class NoDataClass( override val name: String ) : SomeAbstractClass() 

Para cualquier instancia de SomeAbstractClass , ¿puedo determinar si se trata de una class de datos sin depender de la verificación de types?

Algunos antecedentes: esta me pareció la mejor forma de combinar classs de inheritance y datos, como se sugiere en una respuesta diferente . Ahora, dentro del bloque inicializador de SomeAbstractClass , deseo lanzar una exception en caso de que el tipo derivado no sea una class de datos para garantizar implementaciones 'correctas' (inmutables) de types derivados.

Usando la reflexión , la descripción de la class Kotlin ( KClass ) se puede get usando la syntax ::class en la instancia que desea investigar (en su caso, this::class en el bloque de initialization de la class abstracta). Esto le da acceso a isData :

verdadero si esta class es una class de datos.

Sin embargo, como señala Oliver , las classs de datos todavía pueden contener miembros var , por lo que también es probable que desee comprobar si todas las variables miembro (y sus variables miembro recursivamente) se definen como val para garantizar la inmutabilidad de todas las classs derivadas.

  • Kotlin invoke getter / setter reflexivamente
  • ¿Por qué == e iguales producen resultados diferentes?
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • Verificar si la function es extensión
  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?
  • ¿Puedo usar kotlin.reflect para get un valor de un campo
  • ¿Cómo establecer el valor de propiedad delegada por reflexión en kotlin?
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • ¿Cómo puedo get una reference a Kotlin KClass por nombre cuando no se ejecuta en la JVM?
  • Kotlin: ¿Cómo puedo usar la reflexión en los packages?
  • Obteniendo la class actual