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:
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.
Curs de Programació en Kotlin
Mòdul 1: Introducció a Kotlin
- Introducció a Kotlin
- Configuració de l'Entorn de Desenvolupament
- Conceptes Bàsics de Kotlin: Variables i Tipus de Dades
- Flux de Control: Condicionals i Bucles
- Funcions i Lambdas
Mòdul 2: Programació Orientada a Objectes en Kotlin
- Classes i Objectes
- Herència i Interfícies
- Modificadors de Visibilitat
- Classes de Dades i Classes Segellades
- Declaracions d'Objectes i Objectes Companys
Mòdul 3: Funcions Avançades de Kotlin
- Col·leccions i Genèrics
- Funcions d'Extensió
- Funcions d'Ordre Superior i Programació Funcional
- Coroutines i Programació Asíncrona
- DSL (Llenguatge Específic de Domini) en Kotlin
Mòdul 4: Kotlin per al Desenvolupament d'Android
- Introducció al Desenvolupament d'Android amb Kotlin
- Construcció d'Interfícies d'Usuari
- Gestió de l'Entrada de l'Usuari
- Xarxes i Emmagatzematge de Dades
- Proves i Depuració