Classi di dati in Kotlin

1. Panoramica

Il linguaggio Kotlin introduce il concetto di classi di dati, che rappresentano classi semplici usate come contenitori di dati e non incapsulano alcuna logica aggiuntiva. In poche parole, la soluzione di Kotlin ci consente di evitare di scrivere un sacco di codice boilerplate.

In questo rapido articolo, daremo un'occhiata alle classi di dati in Kotlin e le confronteremo con le loro controparti Java.

2. Configurazione di Kotlin

Per iniziare a configurare il progetto Kotlin, controlla la nostra introduzione al tutorial sul linguaggio Kotlin .

3. Classi di dati in Java

Se volessimo creare una voce Film in Java, avremmo bisogno di scrivere molto codice boilerplate:

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 righe di codice. È molto da memorizzare solo tre campi in una semplice classe.

4. Kotlin Data Class

Ora creeremo la stessa classe Movie , con le stesse funzionalità, usando Kotlin :

data class Movie(var name: String, var studio: String, var rating: Float)

Come possiamo vedere, è molto più facile e pulito. Constructor, toString (), equals (), hashCode () e le funzioni aggiuntive copy () e componentN () vengono generate automaticamente.

4.1. Utilizzo

Una classe di dati viene istanziata allo stesso modo delle altre classi:

val movie = Movie("Whiplash", "Sony Pictures", 8.5F)

Ora sono disponibili le proprietà e le funzioni di:

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. Funzione di copia

La copia () viene creata funzione, nel caso che dobbiamo copiare un oggetto alterare alcune proprietà ma mantenendo inalterato il resto.

val betterRating = movie.copy(rating = 9.5F) println(betterRating.toString()) // Movie(name=Whiplash, studio=Sony Pictures, rating=9.5) 

Java non fornisce un modo chiaro e nativo per copiare / clonare oggetti. Potremmo usare l' interfaccia Clonable , SerializationUtils.clone () o un costruttore di clonazione .

4.3. Dichiarazioni di destrutturazione

Le dichiarazioni di destrutturazione ci consentono di trattare le proprietà degli oggetti come valori individuali. Per ogni proprietà nella classe di dati out, viene generato un componentN () :

movie.component1() // name movie.component2() // studio movie.component3() // rating

Possiamo anche creare più variabili dall'oggetto o direttamente da una funzione: è importante ricordare di usare le parentesi:

val(name, studio, rating) = movie fun getMovieInfo() = movie val(namef, studiof, ratingf) = getMovieInfo()

4.4. Requisiti della classe di dati

Per creare una classe di dati, dobbiamo soddisfare i seguenti requisiti:

  • Il costruttore principale deve avere almeno un parametro
  • Tutti i parametri del costruttore principale devono essere contrassegnati come val o var
  • Le classi di dati non possono essere astratte, aperte, sigillate o interne
  • (prima dell'1.1.) Le classi di dati possono implementare solo interfacce

Dalla 1.1, le classi di dati possono estendere altre classi.

Se la classe generata deve avere un costruttore senza parametri, è necessario specificare i valori predefiniti per tutte le proprietà:

data class Movie(var name: String = "", var studio: String = "", var rating: Float = 0F)

5. conclusione

Abbiamo visto le classi di dati in Kotlin, il loro utilizzo e i requisiti, la quantità ridotta di codice boilerplate scritto e confronti con lo stesso codice in Java.

Se vuoi saperne di più su Kotlin, controlla articoli come Kotlin Java Interoperability e la già citata Introduzione al linguaggio Kotlin .

L'implementazione completa di questi esempi può essere trovata nel nostro progetto GitHub.