Clase de datos de Kotlin

En este artículo, aprenderá a crear clases de datos en Kotlin. También aprenderá sobre los requisitos que debe cumplir la clase de datos y sus funcionalidades estándar.

Puede surgir una situación en la que necesite crear una clase únicamente para almacenar datos. En tales casos, puede marcar la clase datapara crear una clase de datos. Por ejemplo,

 clase de datos Persona (nombre de valor: String, edad de var: Int)

Para esta clase, el compilador genera automáticamente:

  • copy()función equals()y hashCode()par y toString()forma del constructor principal
  • componentN() funciones

Antes de hablar sobre estas características en detalle, hablemos de los requisitos que debe cumplir una clase de datos.

Requisitos de la clase de datos de Kotlin

Estos son los requisitos:

  • El constructor principal debe tener al menos un parámetro.
  • Los parámetros del constructor principal deben estar marcados como val(solo lectura) o var(lectura-escritura).
  • La clase no puede ser abierta, abstracta, interna o sellada.
  • La clase puede ampliar otras clases o implementar interfaces. Si está utilizando la versión de Kotlin anterior a la 1.1, la clase solo puede implementar interfaces.

Ejemplo: clase de datos de Kotlin

 data class User(val name: String, val age: Int) fun main(args: Array) ( val jack = User("jack", 29) println("name = $(jack.name)") println("age = $(jack.age)") )

Cuando ejecute el programa, la salida será:

 nombre = jack edad = 29

Cuando se declara una clase de datos, el compilador genera automáticamente varias funciones tales como toString(), equals(), hashcode()etc. detrás de las escenas. Esto ayuda a mantener su código conciso. Si hubiera usado Java, necesitaría escribir mucho código repetitivo.

Usemos estas funciones:

Proceso de copiar

Para una clase de datos, puede crear una copia de un objeto con algunas de sus propiedades diferentes usando la copy()función. Así es como funciona:

 data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) // using copy function to create an object val u2 = u1.copy(name = "Randy") println("u1: name = $(u1.name), name = $(u1.age)") println("u2: name = $(u2.name), name = $(u2.age)") )

Cuando ejecute el programa, la salida será:

 u1: nombre = John, nombre = 29 u2: nombre = Randy, nombre = 29

método toString ()

La función toString () devuelve una representación de cadena del objeto.

 data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )

Cuando ejecute el programa, la salida será:

 Usuario (nombre = John, edad = 29)

hashCode () y equals ()

El hasCode()método devuelve código hash para el objeto. Si dos objetos son iguales, hashCode()produce el mismo resultado entero. Lectura recomendada: hashCode ()

Los equals()retornos truesi dos objetos son iguales (tiene lo mismo hashCode()). Si los objetos no son iguales, equals()regresa false. Lectura recomendada: igual a ()

 data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) val u2 = u1.copy() val u3 = u1.copy(name = "Amanda") println("u1 hashcode = $(u1.hashCode())") println("u2 hashcode = $(u2.hashCode())") println("u3 hashcode = $(u3.hashCode())") if (u1.equals(u2) == true) println("u1 is equal to u2.") else println("u1 is not equal to u2.") if (u1.equals(u3) == true) println("u1 is equal to u3.") else println("u1 is not equal to u3.") )

Cuando ejecute el programa, la salida será:

u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 es igual a u2. u1 no es igual a u3.

Declaraciones de desestructuración

Puede desestructurar un objeto en varias variables utilizando la declaración destructiva. Por ejemplo:

 clase de datos Usuario (nombre de val: String, edad de val: Int, género de val: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )

Cuando ejecute el programa, la salida será:

 nombre = John edad = 29 sexo = Masculino

Esto fue posible porque el compilador genera componentN()funciones con todas las propiedades de una clase de datos. Por ejemplo:

 data class User(val name: String, val age: Int, val gender: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") println(u1.component1()) // John println(u1.component2()) // 29 println(u1.component3()) // "Male" )

Cuando ejecute el programa, la salida será:

 John 29 Hombre

Articulos interesantes...