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.

  • ¿Es seguro llamar a kclass.memberProperties en un object desconocido (Cualquiera)?
  • ¿Por qué == e iguales producen resultados diferentes?
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • Reflexión de KFlin KFunction - get valores de parameters
  • ¿Cómo obtengo una KProperty1 de una KProperty0?
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Reflexión de Kotlin: compruebe si la propiedad tiene tipo
  • Crear una nueva instancia de una KClass
  • ¿Cómo cambiar un campo de miembro con la reflexión de Kotlin?
  • por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>
  • Obteniendo la class actual