Objetos de datos en Kotlin

Jan 21 2023
Los objetos de datos son una nueva función del lenguaje Kotlin que se introdujo en la versión 1.7.

Los objetos de datos son una nueva función del lenguaje Kotlin que se introdujo en la versión 1.7.20y actualmente se planea lanzar en la versión 1.9. Echaremos un vistazo más de cerca a lo que son y qué problema están tratando de resolver.

¿Qué problema están resolviendo los objetos de datos?

A continuación, tenemos un ejemplo típico de una jerarquía de clases sellada en la que usamos sealed interface(también podríamos usar sealed class) para definir posibles estados para una pantalla de perfil. Usamos a data classpara el estado de éxito y an objectpara los estados de error y carga ya que no necesitamos ninguna información adicional.

¿Qué pasa si queremos registrar/imprimir el estado actual de la pantalla por motivos de depuración o para enviarlo a un servicio de análisis? La representación de cadena de la ProfileScreenState.Successclase de datos contiene el nombre de la clase y todas sus propiedades, que es exactamente lo que queremos.
Pero si imprimimos una objectdeclaración simple en Kotlin, obtendremos una cadena que contiene el nombre completo del paquete, el nombre del objeto y la dirección donde se almacena este objeto en la memoria. Y dado que los objetos son singletons en Kotlin, la parte de la dirección seguirá siendo la misma cada vez que imprimamos ese objeto y no es relevante para nosotros.

com.dataobjects.example.ProfileScreenState$Loading@6d03e736
Success(username=exampleUser1)
com.dataobjects.example.ProfileScreenState$Error@5fd0d5ae

Objetos de datos

Kotlin planea resolver esto usando objetos de datos. A data objectes idéntico a un normal objectpero proporciona una implementación predeterminada de la toString()función que imprimirá su nombre, eliminando la necesidad de anularlo manualmente y alineando el comportamiento con una data classdefinición. Son especialmente útiles para jerarquías de clases selladas para hacer coincidir el comportamiento con las clases de datos.

Los objetos de datos son actualmente una función experimental, por lo que para probarlos, debemos decirle al compilador que use la versión Kotlin 1.9:

kotlinOptions.languageVersion = "1.9"

Sugerencia del IDE para convertir un subobjeto sellado en un objeto de datos.
Sugerencia de IDE para convertir un objeto con una función toString anulada en un objeto de datos.

Después de aplicar la sugerencia, nuestros objetos se convierten en un data object:

Y si los imprimimos ahora, podemos ver que su representación de cadena ahora se ve similar a data classy solo se imprime el nombre del objeto.

Loading
Success(username=exampleUser1)
Error

Los objetos de datos son una nueva característica menor del lenguaje que mejora la representación de cadenas de un archivo object. Son más útiles cuando tenemos jerarquías de clases selladas con otras clases de datos y queremos imprimirlas/registrarlas con fines de depuración o análisis.

Tenga en cuenta que los objetos de datos son una nueva función de lenguaje experimental en Kotlin al momento de escribir esta publicación y que su definición podría cambiar en el futuro.

Puede leer más detalles sobre los objetos de datos aquí:

  • Propuesta KEEP de Kotlin:https://github.com/Kotlin/KEEP/blob/data-objects/proposals/data-objects.md
  • Discusión de Kotlin MANTENER:https://github.com/Kotlin/KEEP/issues/317
  • Rastreador de Kotlin:https://youtrack.jetbrains.com/issue/KT-4107/Design-and-implement-a-solution-for-toString-equals-and-hashCode-on-objects-data-object
  • Vídeo oficial de Kotlin:https://www.youtube.com/watch?v=ovAqcwFhEGc
  • Registro de cambios de Kotlin 1.7.20:https://kotlinlang.org/docs/whatsnew1720.html#preview-of-the-operator-for-creating-open-ended-ranges