¿Cuál es la diferencia entre los datos y la clase de objeto en Kotlin y cuál es el propósito de cada uno?
data class User(val name: String, val age: Int)y
object user { val name = "" fun printName(name: String) = "Hello, $name!" }object object es la forma en que Kotlin crea un singleton (una clase de instancia) que el compilador crea una instancia.
data classUna clase de datos es como una clase normal pero con algunas ventajas/restricciones ( Fuente ).
Ventajas
equals() / hashCode()toString()componentN()copy()Se crean a partir de las propiedades especificadas en el constructor principal.
Restricciones
El object de Kotlin es similar a una clase en Java, donde todos los métodos y variables son estáticos.
object User { val name = "" fun printName(name: String) = "Hello, $name!" }en Kotlin es similar a lo siguiente en Java:
class User { public static String name = ""; public static String printName(name: String) { return "Hello " + name + "!"; } }Ejemplo de uso:
//Kotlin User.printName(User.name) //Java User.printName(User.name); Sin embargo, un object no es exactamente lo mismo que la comparación de Java que di. Puede heredar interfaces y clases, y el objeto mismo se instancia como una instancia única. Si anota métodos dentro de un objeto con @JvmStatic , se convertirán en verdaderos miembros estáticos.
La clase de data en Kotlin es solo una sintaxis más simple para una clase que no tiene lógica (o es mínima) y contiene ciertos valores. Kotlin genera las funciones equals() , hashCode() y toString() para usted en una clase de datos, junto con algunas otras funciones auxiliares.
data class User(val name: String, val age: String)en Kotlin se verá así en Java:
class User { public final String name; public final String age; public User(String name, String age) { this.name = name; this.age = age; } @Override public boolean equals(Object other) { //Kotlin-generated equality check } @Override public long hashCode() { //Kotlin's hashcode } @Override public String toString() { return "User(name=" + name + ",age=" + age + ")"; } //other generated methods }Primero, no hay clase de objeto , la característica a la que se refiere se llama declaración de objeto .
Esta es una característica de Kotlin que le permite implementar un singleton . La declaración de objeto combina una declaración de clase y una declaración de una sola instancia de la clase en una sola declaración.
// Let's assume that class Person is defined somewhere else object Payroll { val employees = arrayListOf<Person>() fun calculateSalary() { for (person in employees) { // ... } } } // calling methods and properties >>> Payroll.employees.add(Person("John", 23)) // calling a property >>> Payroll.calculateSalary() // calling a methodAl igual que una clase, una declaración de objeto puede contener declaraciones de propiedades, métodos, bloques de inicialización, etc. Lo único que no están permitidos son los constructores (ya sean primarios o secundarios).
Las declaraciones de objetos se crean inmediatamente en el punto de la definición, no a través de llamadas al constructor desde otros lugares del código.
Nota: la palabra clave de object también se puede usar para objetos complementarios y expresiones de objeto .
Es muy común crear clases cuyo objetivo principal es almacenar datos. Si desea que su clase sea un contenedor conveniente para sus datos, debe anular los métodos de objetos universales:
toString() - representación de cadenaequals() - igualdad de objetoshashCode() - contenedores hashSin embargo, al agregar los datos del modificador a su clase, los métodos necesarios se agregan automáticamente. Además, también se generan los siguientes métodos:
componentN() correspondientes a las propiedades en su orden de declaracióncopy() class PersonClass(val name: String, val age: Int) // regular class data class PersonDataClass(val name: String, val age: Int) // data class En resumen, si necesita un contenedor para datos, debe usar una clase de datos, lo que significa agregar los datos modificadores a su clase. Esto generará los siguientes métodos para usted: toString() , equals() , hashCode() , componentN() y copy() , para evitar escribir código repetitivo. Por otro lado, si necesita crear un singleton, use la función de declaración de objetos.