Est-il possible de créer une extension de classes final comme String? Comme dans swift , il est possible d'ajouter des méthodes supplémentaires dans un extension de final class.

Pour un exemple - je voudrais créer une méthode dans l'extension String qui me dira que String a une longueur valide pour le mot de passe.

 val password : String = mEdtPassword!!.getText().toString()

 // how to define haveValidLength method in extension
 val isValid : Boolean = password.haveValidLength()

Remarque - Cet exemple est juste pour comprendre la convivialité de extension, pas un vrai scénario.

1
Rahul 22 juil. 2017 à 15:50

2 réponses

Meilleure réponse

Oui, vous pouvez. La méthode d'extension de Kotin offre la possibilité d'étendre une classe avec de nouvelles fonctionnalités sans avoir pour hériter de la classe ou utiliser tout type de modèle de conception tel que Decorator.

Voici une méthode d'extension pour un String:

//  v--- the extension method receiver type
fun String.at(value: Int) = this[value]

Et le code de méthode d'extension généré en Java ci-dessous:

public static char at(String receiver, int value){
    return receiver.charAt(value);
}

Ainsi, une méthode d'extension dans Kotlin utilise la délégation plutôt que l'héritage.

Ensuite, vous pouvez appeler une méthode d'extension comme sa fonction membre comme ci-dessous:

println("bar".at(1))//println 'a'

Vous pouvez également écrire une méthode d'extension pour la fonction d'extension existante, par exemple:

fun String.substring(value: Int): String = TODO()

//    v--- throws exception rather than return "ar"
"bar".substring(1)

Mais vous ne pouvez pas écrire une méthode d'extension pour la fonction membre existante, par exemple:

operator fun String.get(value: Int): Char = TODO()

//   v--- return 'a' rather than throws an Exception
val second = "bar"[1]
3
holi-java 22 juil. 2017 à 16:44

Vous pouvez le faire avec les fonctions d'extension dans Kotlin. Avec les extensions, vous pouvez ajouter des fonctionnalités supplémentaires à une classe à laquelle vous avez ou n'avez pas accès; par exemple une base de code héritée. Dans l'exemple donné dans la documentation Kotlin ici, swap a été ajouté à MutableList<Int> qui n'a pas swap à l'origine. Un mot clé this est utilisé et fait référence à l'objet sur lequel la fonctionnalité d'échange fonctionnera. Dans l'exemple ci-dessous, this fait référence à testList

val testList = mutableListOf(1, 2, 3)
testList.swap(0, 2)
0
Alf Moh 22 juil. 2017 à 13:14