En aquest tema, explorarem dos tipus especials de classes en Kotlin: les classes de dades i les classes segellades. Aquests tipus de classes ofereixen funcionalitats específiques que poden simplificar el codi i millorar la seva llegibilitat i mantenibilitat.

Classes de Dades

Les classes de dades (data classes) en Kotlin són classes que es fan servir principalment per emmagatzemar dades. Kotlin proporciona una manera senzilla de crear aquestes classes amb funcionalitats automàtiques com equals(), hashCode(), toString(), i copy().

Definició d'una Classe de Dades

Per definir una classe de dades, utilitzem la paraula clau data davant de la declaració de la classe:

data class Persona(val nom: String, val edat: Int)

Funcionalitats Automàtiques

Quan definim una classe de dades, Kotlin genera automàticament les següents funcions:

  • equals(): Compara dues instàncies de la classe per veure si són iguals.
  • hashCode(): Genera un codi hash per a l'objecte.
  • toString(): Proporciona una representació en forma de cadena de l'objecte.
  • copy(): Crea una còpia de l'objecte amb la possibilitat de modificar algunes de les seves propietats.

Exemple Pràctic

fun main() {
    val persona1 = Persona("Joan", 30)
    val persona2 = Persona("Joan", 30)
    
    // equals() i hashCode()
    println(persona1 == persona2) // true
    println(persona1.hashCode() == persona2.hashCode()) // true
    
    // toString()
    println(persona1) // Persona(nom=Joan, edat=30)
    
    // copy()
    val persona3 = persona1.copy(edat = 31)
    println(persona3) // Persona(nom=Joan, edat=31)
}

Exercici Pràctic

Exercici 1: Defineix una classe de dades anomenada Producte amb les propietats nom (String) i preu (Double). Crea dues instàncies de Producte amb els mateixos valors i comprova si són iguals. Després, crea una còpia d'una de les instàncies canviant el preu.

Solució:

data class Producte(val nom: String, val preu: Double)

fun main() {
    val producte1 = Producte("Llibre", 15.99)
    val producte2 = Producte("Llibre", 15.99)
    
    // equals() i hashCode()
    println(producte1 == producte2) // true
    println(producte1.hashCode() == producte2.hashCode()) // true
    
    // copy()
    val producte3 = producte1.copy(preu = 12.99)
    println(producte3) // Producte(nom=Llibre, preu=12.99)
}

Classes Segellades

Les classes segellades (sealed classes) són una manera de representar jerarquies de classes restringides. Una classe segellada pot tenir subclasses, però totes aquestes subclasses han d'estar declarades dins del mateix fitxer que la classe segellada.

Definició d'una Classe Segellada

Per definir una classe segellada, utilitzem la paraula clau sealed davant de la declaració de la classe:

sealed class Resultat
data class Èxit(val dades: String) : Resultat()
data class Error(val missatge: String) : Resultat()

Ús de les Classes Segellades

Les classes segellades són útils quan volem representar un conjunt limitat de possibles tipus de resultats. Podem utilitzar una expressió when per manejar cada tipus de resultat de manera exhaustiva.

Exemple Pràctic

fun manejarResultat(resultat: Resultat) {
    when (resultat) {
        is Èxit -> println("Èxit: ${resultat.dades}")
        is Error -> println("Error: ${resultat.missatge}")
    }
}

fun main() {
    val resultat1: Resultat = Èxit("Dades carregades correctament")
    val resultat2: Resultat = Error("Error de xarxa")
    
    manejarResultat(resultat1) // Èxit: Dades carregades correctament
    manejarResultat(resultat2) // Error: Error de xarxa
}

Exercici Pràctic

Exercici 2: Defineix una classe segellada anomenada Resposta amb dues subclasses: Correcte (amb una propietat dades de tipus String) i Incorrecte (amb una propietat missatge de tipus String). Crea una funció que prengui una instància de Resposta i imprimeixi un missatge diferent segons el tipus de resposta.

Solució:

sealed class Resposta
data class Correcte(val dades: String) : Resposta()
data class Incorrecte(val missatge: String) : Resposta()

fun manejarResposta(resposta: Resposta) {
    when (resposta) {
        is Correcte -> println("Correcte: ${resposta.dades}")
        is Incorrecte -> println("Incorrecte: ${resposta.missatge}")
    }
}

fun main() {
    val resposta1: Resposta = Correcte("Operació completada")
    val resposta2: Resposta = Incorrecte("Error en l'operació")
    
    manejarResposta(resposta1) // Correcte: Operació completada
    manejarResposta(resposta2) // Incorrecte: Error en l'operació
}

Conclusió

En aquesta secció, hem après sobre les classes de dades i les classes segellades en Kotlin. Les classes de dades simplifiquen la creació de classes que emmagatzemen dades, mentre que les classes segellades ens permeten definir jerarquies de classes restringides. Amb aquests coneixements, estem millor preparats per escriure codi Kotlin més net i mantenible. En la següent secció, explorarem les declaracions d'objectes i els objectes companys.

© Copyright 2024. Tots els drets reservats