Les funcions d'extensió són una característica poderosa de Kotlin que permet afegir noves funcionalitats a les classes existents sense haver de modificar-les. Això és especialment útil quan treballes amb classes de biblioteques de tercers o classes que no pots modificar directament.

Conceptes Clau

  1. Definició de Funcions d'Extensió: Una funció d'extensió és una funció que es defineix fora de la classe a la qual s'aplica, però que es pot cridar com si fos una funció membre d'aquesta classe.
  2. Sintaxi: La sintaxi per definir una funció d'extensió és fun <ClassName>.<functionName>(parameters): ReturnType { ... }.
  3. Visibilitat: Les funcions d'extensió no poden accedir a membres privats o protegits de la classe a la qual s'estenen.

Exemples Pràctics

Exemple 1: Afegir una Funció d'Extensió a la Classe String

// Definició de la funció d'extensió
fun String.isPalindrome(): Boolean {
    val cleaned = this.replace("\\s".toRegex(), "").toLowerCase()
    return cleaned == cleaned.reversed()
}

// Ús de la funció d'extensió
fun main() {
    val word = "A man a plan a canal Panama"
    println(word.isPalindrome())  // Sortida: true
}

Explicació:

  • La funció isPalindrome s'afegeix a la classe String.
  • La funció elimina els espais i converteix la cadena a minúscules abans de comprovar si és un palíndrom.

Exemple 2: Afegir una Funció d'Extensió a la Classe List

// Definició de la funció d'extensió
fun <T> List<T>.secondOrNull(): T? {
    return if (this.size >= 2) this[1] else null
}

// Ús de la funció d'extensió
fun main() {
    val list = listOf(1, 2, 3)
    println(list.secondOrNull())  // Sortida: 2

    val emptyList = listOf<Int>()
    println(emptyList.secondOrNull())  // Sortida: null
}

Explicació:

  • La funció secondOrNull s'afegeix a la classe List.
  • La funció retorna el segon element de la llista o null si la llista té menys de dos elements.

Exercicis Pràctics

Exercici 1: Funció d'Extensió per a la Classe Int

Descripció: Escriu una funció d'extensió per a la classe Int que comprovi si un nombre és parell.

Solució:

fun Int.isEven(): Boolean {
    return this % 2 == 0
}

fun main() {
    val number = 4
    println(number.isEven())  // Sortida: true

    val anotherNumber = 5
    println(anotherNumber.isEven())  // Sortida: false
}

Exercici 2: Funció d'Extensió per a la Classe List

Descripció: Escriu una funció d'extensió per a la classe List que retorni el nombre d'elements únics en la llista.

Solució:

fun <T> List<T>.uniqueCount(): Int {
    return this.toSet().size
}

fun main() {
    val list = listOf(1, 2, 2, 3, 4, 4, 5)
    println(list.uniqueCount())  // Sortida: 5
}

Errors Comuns i Consells

  1. Accés a Membres Privats: Recorda que les funcions d'extensió no poden accedir a membres privats o protegits de la classe a la qual s'estenen.
  2. Confusió amb Funcions Membres: Si una classe ja té una funció amb el mateix nom i signatura que una funció d'extensió, la funció membre sempre tindrà prioritat.
  3. Ús Adequat: Utilitza funcions d'extensió per afegir funcionalitats que tinguin sentit per a la classe a la qual s'estenen. No abusis d'aquesta característica per evitar crear codi confús o difícil de mantenir.

Conclusió

Les funcions d'extensió són una eina poderosa en Kotlin que permeten afegir funcionalitats a les classes existents de manera neta i modular. Amb una comprensió clara de com definir i utilitzar aquestes funcions, pots escriure codi més flexible i reutilitzable. En el següent tema, explorarem les funcions d'ordre superior i la programació funcional en Kotlin.

© Copyright 2024. Tots els drets reservats