In deze tutorial zullen we kijken naar Kotlin Data Class. Als je de Kotlin Classes post nog niet hebt gelezen, raden we je aan om dat te doen voordat je verder gaat.
Kotlin Data Class
Word je moe van het schrijven van duizenden regels code voor je POJO-datatypen in Java? Elke Java-programmeur moet op een gegeven moment hebben opgemerkt hoeveel regels code ze moeten schrijven voor klassen die alleen maar wat gegevens moeten opslaan. Laten we eens kijken hoe een
Book.java
POJO-klasse eruitziet:
public class Book {
private String name;
private String authorName;
private long lastModifiedTimeStamp;
private float rating;
private int downloads;
public Book(String name, String authorName, long lastModified, float rating, int downloads) {
this.name = name;
this.authorName = authorName;
this.lastModifiedTimeStamp = lastModified;
this.rating = rating;
this.downloads = downloads;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public long getLastModifiedTimeStamp() {
return lastModifiedTimeStamp;
}
public void setLastModifiedTimeStamp(long lastModifiedTimeStamp) {
this.lastModifiedTimeStamp = lastModifiedTimeStamp;
}
public float getRating() {
return rating;
}
public void setRating(float rating) {
this.rating = rating;
}
public int getDownloads() {
return downloads;
}
public void setDownloads(int downloads) {
this.downloads = downloads;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book that = (Book) o;
if (downloads != that.downloads)
return false;
if (name != null ? !name.equals(that.name) :
that.name != null) {
return false;
}
return authorName != null ?
authorName.equals(that.authorName) :
that.authorName == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (authorName != null ?
authorName.hashCode() : 0);
result = 31 * result + downloads;
return result;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + authorName + '\'' +
", lastModifiedTimestamp='" + lastModifiedTimeStamp + '\'' +
", rating='" + rating + '\'' +
", downloads=" + downloads +
'}';
}
}
WOAH! Dat zijn 96 regels code alleen al voor het opslaan van 5 velden in een object. We doen hier niet veel anders dan getter-setters, toString()
, equals()
en hashCode()
methoden hebben. Met de schone architecturen en scheiding van codepraktijken in onze praktijken moeten we POJO-klassen maken omdat elk project ergens gegevens moet opslaan. Dit kan de hoeveelheid standaardcode verhogen. Hier komt Kotlin te hulp, met het gebruik van Data Classes. Data Classes zijn Kotlin’s antwoord op het verminderen van standaardcode. De bovenstaande POJO-klasse kan in Kotlin als volgt worden geschreven:
data class Book(var name: String, var authorName: String, var lastModified: Long, var rating: Float, var downloads: Int)
DAT IS HET. Kotlin zet een 96-regels Java-code om naar één regel code. Dit is Kotlin’s manier om de standaardcode in je project te verminderen!
Het maken van een Kotlin Dataklasse
De volgende zijn de vereisten voor het maken van een Kotlin Dataklasse.
- Je moet de klasse aanvullen met het trefwoord
data
- De primaire constructor moet minstens één parameter hebben.
- Elke parameter van de primaire constructor moet een
val
of eenvar
toegewezen hebben. Dit is niet het geval bij een normale klasse, waarbij het specificeren van eenval
of eenvar
niet verplicht is. - Dataklassen kunnen niet worden aangevuld met
abstract
,open
,sealed
ofinner
Ingebouwde methoden van Kotlin Dataklasse
Kotlin Dataklasse maakt automatisch de volgende functies voor je aan.
equals()
enhashCode()
toString()
in de vorm van"Boek(naam=JournalDev, auteursnaam=Anupam)"
componentN()
functies voor elk van de parameters in de opgegeven volgorde. Dit staat bekend als destructureringsverklaringen.copy()
Kotlin Data Class-functies
Hier zijn enkele functies die een Data Class biedt.
-
Om een parameterloze constructor te maken, geef standaardwaarden op voor elk van de parameters aanwezig in de primaire constructor.
-
Een Data Class staat onderklassen toe (Geen noodzaak om het trefwoord
open
te vermelden). -
Je kunt expliciete implementaties geven voor de functies
equals()
,hashCode()
entoString()
-
Expliciete implementaties voor de functies
copy()
encomponentN()
zijn niet toegestaan. -
We kunnen de zichtbaarheid van de getters en setters controleren door de zichtbaarheidsmodificatoren op te geven in de constructor zoals hieronder weergegeven.
data class Book(var name: String,private var authorName: String, var lastModified: Long, var rating: Float, var downloads: Int)
-
Een val-parameter heeft impliciet geen setter gedefinieerd (kan ook niet expliciet worden gedaan!).
Standaard- en benoemde argumenten in gegevensklasse
Hieronder volgt onze gegevensklasse:
data class Book(var name: String, var authorName: String, var lastModified: Long, var rating: Float, var downloads: Int)
Geen van de parameters heeft een standaardwaarde ingesteld. Dus we moeten een argument instellen voor elk van hen bij de instantiatie zoals hieronder getoond.
fun main(args: Array<String>) {
val book = Book("Android Tutorials","Anupam", 1234567, 4.5f, 1000)
}
Laten we een paar standaardargumenten instellen en kijken hoe de instantiatie verandert.
data class Book(var name: String, var authorName: String = "Anupam", var lastModified: Long = 1234567, var rating: Float = 5f, var downloads: Int = 1000)
fun main(args: Array<String>) {
var book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
book = Book("Kotlin")
book = Book("Swift",downloads = 500)
book = Book("Java","Pankaj",rating = 5f, downloads = 1000)
book = Book("Python","Shubham",rating = 5f)
}
In plaats van elk argument in te stellen, kunnen we alleen de niet-standaard argumenten instellen en degene die we willen gebruiken met behulp van het benoemde argument. Met benoemde argumenten kunnen we het 5e argument als het tweede instellen door expliciet de parameter naam te specificeren gevolgd door =
. Het leven is zo makkelijker op deze manier!
Kotlin Dataklasse toString() Methode
De toString() wordt impliciet aangemaakt en print de argumentnamen en labels voor de instantie zoals hieronder getoond.
data class Book(var name: String, var authorName: String = "Anupam", var lastModified: Long = 1234567, var rating: Float = 5f, var downloads: Int = 1000)
fun main(args: Array) {
var book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println(book)
book = Book("Kotlin")
println(book)
book = Book("Swift",downloads = 500)
println(book)
book = Book("Java","Pankaj",rating = 5f, downloads = 1000)
println(book.toString())
book = Book("Python","Shubham",rating = 5f)
println(book.toString())
}
//Volgende wordt afgedrukt in de console.
//Book(name=Android tutorials, authorName=Anupam, lastModified=1234567, rating=4.5, downloads=1000)
//Book(name=Kotlin, authorName=Anupam, lastModified=1234567, rating=5.0, downloads=1000)
//Book(name=Swift, authorName=Anupam, lastModified=1234567, rating=5.0, downloads=500)
//Book(name=Java, authorName=Pankaj, lastModified=1234567, rating=5.0, downloads=1000)
//Book(name=Python, authorName=Shubham, lastModified=1234567, rating=5.0, downloads=1000)
Note: print
functie voegt impliciet een toString() toe.
Kotlin Data Class copy() Methode
Kopieerfunctie wordt gebruikt om een kopie van een instantie van de dataklasse te maken met enkele van de eigenschappen gewijzigd. Het wordt aanbevolen om valparameters te gebruiken in de constructor van dataklassen om onveranderlijke eigenschappen van instanties te gebruiken. Onveranderlijke objecten zijn eenvoudiger bij het werken met multi-threaded applicaties. Daarom is het handig om een kopie van een onveranderlijk object te maken door slechts enkele eigenschappen te wijzigen, met behulp van de copy()
-functie.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println(book)
val newBook = book.copy(name = "Kotlin")
println(newBook)
}
//Volgende wordt afgedrukt in de console.
//Book(name=Android tutorials, authorName=Anupam, lastModified=1234567, rating=4.5, downloads=1000)
//Book(name=Kotlin, authorName=Anupam, lastModified=1234567, rating=4.5, downloads=1000)
Kotlin Dataklasse equals() en hashCode()
De hashCode()
-methode retourneert een hashcode voor het object. Als twee objecten gelijk zijn, produceert hashCode()
hetzelfde integerresultaat. Daarom retourneert equals()
true als de hashCode()
gelijk is, anders retourneert het false.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println("Hashcode is ${book.hashCode()}")
val newBook = book.copy(name = "Kotlin")
println("Hashcode is ${newBook.hashCode()}")
val copyBook = book.copy()
println("Hashcode is ${copyBook.hashCode()}")
if(copyBook.equals(book))
println("copyBook and book are equal")
if(!book.equals(newBook))
println("newBook and book are NOT equal")
}
//Het volgende wordt afgedrukt in de console.
//Hashcode is 649213087
//Hashcode is 1237165820
//Hashcode is 649213087
//copyBook en book zijn gelijk
//newBook en book zijn NIET gelijk
De hashcodes van het eerste en derde object zijn gelijk, dus ze zijn gelijk. Opmerking: De equals()
-methode is equivalent aan ==
in Kotlin.
Verklarende declaraties
De componentN()
-functie stelt ons in staat om elk van de argumenten die zijn gespecificeerd in de constructor, in de opgegeven volgorde, te benaderen. N is het aantal parameters in de constructor.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array<String>) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println(book.component1()) //Android tutorials
println(book.component2()) //Anupam
println(book.component3()) //1234567
println(book.component4()) //4.5
println(book.component5()) //1000
}
Verklarende declaraties stellen ons in staat om de argumenten als eigenschappen van het klasse-object te benaderen zoals hieronder wordt getoond.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array<String>) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
val (n,a,date,rating,downloads) = book
}
Opmerking: Als er een zichtbaarheidsmodifier zoals privé wordt ingesteld op een van de argumenten, kan deze niet worden benaderd in de bovenstaande functie.
data class Book(val name: String,private val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array<String>) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
val (n,a,date,rating,downloads) = book //This won't compile since authorName is private
}
Dat is alles voor een snelle samenvatting van Kotlin Data Classes. Referenties: Kotlin-documentatie
Source:
https://www.digitalocean.com/community/tutorials/kotlin-data-class