Clases de datos en Kotlin

Cuál es la diferencia entre:

definición 1

data class Person (var name:String, var age:Int) 

definición 2

 class Person (var name:String, var age:Int) 

definición 3

 class Person (){ var name:String = "" var age:Int = 1 } 

En los 3 casos en que uso el autocompletado, vi que los mismos methods disponibles, como un POJO … ¿son los mismos pero de 3 maneras diferentes?

enter image description here

Diferencia en equals , hashCode , y toString

la diferencia más importante entre la definición 1 y las definiciones 2 y 3 es que en la definición 1 , los methods equals , hashcode y toString están anulados para usted:

  • hashCode methods equals y hashCode testingn la igualdad estructural
  • toString método toString devuelve una cadena agradable y amigable para el usuario

Ejemplo de código:

NOTA: en Kotlin, el operador == llama al método .equals() un object. ver la sobrecarga del operador en kotlinlang.org para más información .

 data class Person1 (var name:String, var age:Int) class Person2 (var name:String, var age:Int) @Test fun test1() { val alice1 = Person1("Alice", 22) val alice2 = Person1("Alice", 22) val bob = Person1("bob", 23) // alice1 and alice2 are structurally equal, so this returns true. println(alice1 == alice2) // true // alice1 and bob are NOT structurally equal, so this returns false. println(alice1 == bob) // false // the toString method for data classes are generated for you. println(alice1) // Person1(name=Alice, age=22) } @Test fun test2() { val alice1 = Person2("Alice", 22) val alice2 = Person2("Alice", 22) val bob = Person2("bob", 23) // even though alice1 and alice2 are structurally equal, this returns false. println(alice1 == alice2) // false println(alice1 == bob) // false // the toString method for normal classes are NOT generated for you. println(alice1) // Person2@1ed6993a } 

Diferencia en constructores

Otra diferencia entre las definiciones 1 y 2 y la definición 3 es que:

  • las definiciones 1 y 2 tienen un constructor que toma 2 parameters
  • La definición 3 solo tiene un constructor sin arguments que asigna valores pnetworkingeterminados a los miembros de la class.

Ejemplo de código:

 data class Person1 (var name:String, var age:Int) class Person2 (var name:String, var age:Int) class Person3 () { var name:String = "" var age:Int = 1 } @Test fun test3() { Person1("alice",22) // OK Person2("bob",23) // OK Person3("charlie",22) // error Person1() // error Person2() // error Person3() // OK } 

El método de copy

Finalmente, otra diferencia entre la definición 1 y las definiciones 2 y 3 es que en la definición 1 , se genera un método de copy para ella. Aquí hay un ejemplo de cómo se puede usar:

 val jack = Person1("Jack", 1) val olderJack = jack.copy(age = 2) // jack.age = 1 // olderJack.age = 2 

¡Consulte la documentation oficial de las classs de datos en kotlinlang.org!

Definición 1 ( data class Person(var name: String, var age: Int ) es el equivalente de

 /* every class by default in kotlin is final but a data class CAN'T be open */ final class Person(var name: String, var age: Int) { override fun equals(other: Any?): Boolean { if (this === other) return true if (other?.javaClass != javaClass) return false other as Person if (name != other.name) return false if (age != other.age) return false return true } override fun hashCode(): Int { var result = name.hashCode() result = 31 * result + age return result } } val person = Person("Name", 123) 

Definición 2 ( class Person(var name: String, var age: Int [no data modifier]) es el equivalente de

 class Person(var name: String, var age: Int) { } val person = Person("Name", 123) 

La definición 3 es el equivalente de

 class Person() { var name: String = "" var age: Int = 1 } val person = Person() // name = "", age = 1 (by default) person.name = "Name" person.age = 123 
  • Clase abstracta Kotlin java IllegalAccessError
  • Kotlin Vertx Type Mismatch encontrado Future <Unit> expected Handler <AsyncResult <Void >>
  • ¿Es posible acceder a las tipografías de Kotlin desde Java?
  • La inferencia del tipo Java lambda no funciona como se esperaba en Kotlin
  • ¿Es posible build una aplicación web completa de Node.js usando Kotlin?
  • 'x' no es una function al pasar parameters en Kotlin Javascript
  • Choque de statement de plataforma con comparable
  • Java -> Conversión de Kotlin con types crudos
  • Kotlin: cómo pasar la matriz a la anotación de Java
  • ¿Cómo puedo declarar un parámetro de function que puede ser una cadena o una function en Kotlin?
  • Smart Cast no funciona como se esperaba