Dataklasser i Kotlin
1. Oversigt
Kotlin-sproget introducerer begrebet dataklasser, som repræsenterer enkle klasser, der bruges som databeholdere og ikke indkapsler yderligere logik. Kort sagt, Kotlins løsning giver os mulighed for at undgå at skrive en masse kedelpladekode.
I denne hurtige artikel vil vi se på dataklasser i Kotlin og sammenligne dem med deres Java-kolleger.
2. Kotlin-opsætning
For at komme i gang med opsætningen af Kotlin-projektet, se vores introduktion til Kotlin-sproget vejledning.
3. Dataklasser i Java
Hvis vi ville skabe et Film post i Java, vi bliver nødt til at skrive en masse kedelpladekode:
offentlig klassefilm {privat strengnavn; private String studio; privat float-vurdering; offentlig film (String name, String studio, float rating) {this.name = name; this.studio = studie; this.rating = rating; } public String getName () {return name; } public void setName (strengnavn) {this.name = name; } offentlig String getStudio () {returstudie; } 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 resultat = 1; resultat = prime * resultat + ((navn == null)? 0: name.hashCode ()); resultat = prime * resultat + Float.floatToIntBits (rating); resultat = prime * resultat + ((studio == null)? 0: studio.hashCode ()); returresultat } @ Override offentlige boolske lig (Objekt obj) {hvis (dette == obj) returnerer sandt; hvis (obj == null) returnerer false; hvis (getClass ()! = obj.getClass ()) returnerer false; Film andet = (Film) objekt; if (name == null) {if (other.name! = null) returner false; } ellers hvis (! name.equals (other.name)) returnerer false; hvis (Float.floatToIntBits (rating)! = Float.floatToIntBits (other.rating)) returnerer false; if (studio == null) {if (other.studio! = null) returner false; } ellers hvis (! studio.equals (other.studio)) returnerer false; returner sandt; } @Override public String toString () {return "Film [name =" + name + ", studio =" + studio + ", rating =" + rating + "]"; }}
86 linjer kode. Det er meget at kun gemme tre felter i en simpel klasse.
4. Kotlin-dataklasse
Nu opretter vi det samme Film klasse med de samme funktioner ved hjælp af Kotlin:
dataklasse Film (var navn: String, var studio: String, var rating: Float)
Som vi kan se, er det meget lettere og renere. Konstruktør, toString (), er lig med (), hashCode (), og yderligere kopi() og komponentN () funktioner genereres automatisk.
4.1. Anvendelse
En dataklasse instantieres på samme måde som andre klasser:
val movie = Movie ("Whiplash", "Sony Pictures", 8.5F)
Nu er egenskaberne og funktionerne til tilgængelige:
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, vurdering = 9.0)
4.2. Kopifunktion
Det kopi() funktion oprettes, hvis vi har brug for at kopiere et objekt, der ændrer nogle af dets egenskaber, men holder resten uændret.
val betterRating = movie.copy (rating = 9.5F) println (betterRating.toString ()) // Film (name = Whiplash, studio = Sony Pictures, rating = 9.5)
Java giver ikke en klar, indfødt måde til kopiering / kloning af objekter. Vi kunne bruge Klonabel interface, SerializationUtils.clone () eller a kloningskonstruktør.
4.3. Erklæringer om destruktion
Destruktureringserklæringer giver os mulighed for at behandle objektegenskaber som individuelle værdier. For hver ejendom i vores dataklasse, a komponentN () genereres:
movie.component1 () // name movie.component2 () // studio movie.component3 () // rating
Vi kan også oprette flere variabler fra objektet eller direkte fra en funktion - det er vigtigt at huske at bruge parenteser:
val (navn, studie, vurdering) = film sjovt getMovieInfo () = film val (namef, studiof, ratingf) = getMovieInfo ()
4.4. Krav til dataklasse
For at oprette en dataklasse skal vi opfylde følgende krav:
- Den primære konstruktør skal have mindst en parameter
- Alle primære konstruktorparametre skal markeres som val eller var
- Dataklasser kan ikke være abstrakte, åbne, forseglede eller indre
- (før 1.1.) Dataklasser kan kun implementere grænseflader
Siden 1.1 kan dataklasser udvide andre klasser.
Hvis den genererede klasse skal have en parameterløs konstruktør, skal standardværdier for alle egenskaber angives:
dataklasse Film (var navn: String = "", var studio: String = "", var rating: Float = 0F)
5. Konklusion
Vi har set dataklasser i Kotlin, deres brug og krav, den reducerede mængde kogepladekode skrevet og sammenligninger med den samme kode i Java.
Hvis du vil lære mere om Kotlin, skal du kontrollere artikler som f.eks Kotlin Java-interoperabilitet og det allerede nævnte Introduktion til Kotlin-sproget.
Den fulde implementering af disse eksempler kan findes i vores GitHub-projekt.