Класове данни в Kotlin

1. Общ преглед

Езикът Kotlin въвежда концепцията за класове данни, които представляват прости класове, използвани като контейнери за данни и не капсулират никаква допълнителна логика. Най-просто казано, решението на Kotlin ни позволява да избягваме да пишем много шаблонни кодове.

В тази кратка статия ще разгледаме класовете данни в Kotlin и ще ги сравним с техните аналози в Java.

2. Настройка на Kotlin

За да започнете да настройвате проекта Kotlin, проверете нашето въведение в урока по езика Kotlin .

3. Класове данни в Java

Ако искахме да създадем запис на филм в Java, ще трябва да напишем много шаблонни кодове:

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 реда код. Това е много, за да се съхраняват само три полета в прост клас.

4. Клас данни на Kotlin

Сега ще създадем същия клас Movie , със същите функционалности, използвайки Kotlin :

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

Както виждаме, това е значително по-лесно и по-чисто. Конструктор, toString (), equals (), hashCode () и допълнителни функции copy () и componentN () се генерират автоматично.

4.1. Употреба

Класът данни се създава по същия начин като другите класове:

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

Сега са налични свойствата и функциите на:

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. Функция за копиране

Създава се функцията copy () , в случай че трябва да копираме обект, променящ някои от неговите свойства, но запазвайки останалите непроменени.

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

Java не предоставя ясен, естествен начин за копиране / клониране на обекти. Можем да използваме интерфейс Clonable , SerializationUtils.clone () или конструктор за клониране .

4.3. Декларации за деструктуриране

Декларациите за деструктуриране ни позволяват да третираме свойствата на обектите като индивидуални стойности. За всяко свойство в клас данни от данни се генерира компонентN () :

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

Също така можем да създадем множество променливи от обекта или директно от функция - важно е да запомните за използването на скоби:

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

4.4. Изисквания за клас данни

За да създадем клас данни, трябва да изпълним следните изисквания:

  • Първичният конструктор трябва да има поне един параметър
  • Всички параметри на основния конструктор трябва да бъдат маркирани като val или var
  • Класовете данни не могат да бъдат абстрактни, отворени, запечатани или вътрешни
  • (преди 1.1.) Класовете данни могат да реализират само интерфейси

От 1.1, класовете данни могат да разширяват други класове.

Ако генерираният клас трябва да има конструктор без параметри, трябва да бъдат посочени стойности по подразбиране за всички свойства:

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

5. Заключение

Виждали сме класове данни в Kotlin, тяхното използване и изисквания, намаленото количество написан код на шаблон и сравнения със същия код в Java.

Ако искате да научите повече за Kotlin, проверете статии като Kotlin Java Interoperable и вече споменатото Въведение в езика Kotlin .

Пълното изпълнение на тези примери може да бъде намерено в нашия проект GitHub.