1. Información general
El lenguaje Kotlin introduce el concepto de Clases de datos, que representan clases simples utilizadas como contenedores de datos y no encapsulan ninguna lógica adicional. En pocas palabras, la solución de Kotlin nos permite evitar escribir mucho código repetitivo.
En este artículo rápido, echaremos un vistazo a las clases de datos en Kotlin y las compararemos con sus contrapartes de Java.
2. Configuración de Kotlin
Para comenzar a configurar el proyecto Kotlin, consulte nuestra introducción al tutorial de Kotlin Language .
3. Clases de datos en Java
Si quisiéramos crear una entrada de película en Java, necesitaríamos escribir mucho código repetitivo:
public class Movie { private String name; private String studio; private float rating; public Movie(String name, String studio, float rating) { this.name = name; this.studio = studio; this.rating = rating; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStudio() { return studio; } public void setStudio(String studio) { this.studio = studio; } public float getRating() { return rating; } public void setRating(float rating) { this.rating = rating; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + Float.floatToIntBits(rating); result = prime * result + ((studio == null) ? 0 : studio.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Movie other = (Movie) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (Float.floatToIntBits(rating) != Float.floatToIntBits(other.rating)) return false; if (studio == null) { if (other.studio != null) return false; } else if (!studio.equals(other.studio)) return false; return true; } @Override public String toString() { return "Movie [name=" + name + ", studio=" + studio + ", rating=" + rating + "]"; } }
86 líneas de código. Eso es mucho para almacenar solo tres campos en una clase simple.
4. Clase de datos de Kotlin
Ahora, crearemos la misma clase Movie , con las mismas funcionalidades, usando Kotlin :
data class Movie(var name: String, var studio: String, var rating: Float)
Como podemos ver, es mucho más fácil y limpio. Constructor, toString (), equals (), hashCode () y las funciones adicionales copy () y componentN () se generan automáticamente.
4.1. Uso
Una clase de datos se crea de la misma manera que otras clases:
val movie = Movie("Whiplash", "Sony Pictures", 8.5F)
Ahora, las propiedades y funciones de están disponibles:
println(movie.name) //Whiplash println(movie.studio) //Sony Pictures println(movie.rating) //8.5 movie.rating = 9F println(movie.toString()) //Movie(name=Whiplash, studio=Sony Pictures, rating=9.0)
4.2. Función de copia
Se crea la función copy () , en caso de que necesitemos copiar un objeto alterando algunas de sus propiedades pero manteniendo el resto sin cambios.
val betterRating = movie.copy(rating = 9.5F) println(betterRating.toString()) // Movie(name=Whiplash, studio=Sony Pictures, rating=9.5)
Java no proporciona una forma clara y nativa de copiar / clonar objetos. Podríamos usar la interfaz Clonable , SerializationUtils.clone () o un constructor de clonación .
4.3. Declaraciones de desestructuración
Las Declaraciones de Desestructuración nos permiten tratar las propiedades de los objetos como valores individuales. Para cada propiedad en nuestra clase de datos, se genera un componentN () :
movie.component1() // name movie.component2() // studio movie.component3() // rating
También podemos crear varias variables desde el objeto o directamente desde una función; es importante recordar el uso de corchetes:
val(name, studio, rating) = movie fun getMovieInfo() = movie val(namef, studiof, ratingf) = getMovieInfo()
4.4. Requisitos de clase de datos
Para crear una clase de datos, tenemos que cumplir con los siguientes requisitos:
- El constructor principal debe tener al menos un parámetro
- Todos los parámetros del constructor principal deben marcarse como val o var
- Las clases de datos no pueden ser abstractas, abiertas, selladas o internas
- (antes de 1.1.) Las clases de datos solo pueden implementar interfaces
Desde 1.1, las clases de datos pueden extenderse a otras clases.
Si la clase generada necesita tener un constructor sin parámetros, se deben especificar los valores predeterminados para todas las propiedades:
data class Movie(var name: String = "", var studio: String = "", var rating: Float = 0F)
5. Conclusión
Hemos visto clases de datos en Kotlin, su uso y requisitos, la cantidad reducida de código repetitivo escrito y comparaciones con el mismo código en Java.
Si desea obtener más información sobre Kotlin, consulte artículos como Kotlin Java Interoperability y la ya mencionada Introducción al lenguaje Kotlin .
La implementación completa de estos ejemplos se puede encontrar en nuestro proyecto GitHub.