Kotlin Data Class

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 een var toegewezen hebben. Dit is niet het geval bij een normale klasse, waarbij het specificeren van een val of een var niet verplicht is.
  • Dataklassen kunnen niet worden aangevuld met abstract, open, sealed of inner

Ingebouwde methoden van Kotlin Dataklasse

Kotlin Dataklasse maakt automatisch de volgende functies voor je aan.

  • equals() en hashCode()
  • 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() en toString()

  • Expliciete implementaties voor de functies copy() en componentN() 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