Interopérabilité Kotlin Java

1. Vue d'ensemble

Dans ce tutoriel, nous allons discuter de l' interopérabilité entre Java et Kotlin. Nous allons couvrir quelques exemples de base ainsi que d'autres scénarios plus complexes.

2. Configuration de Kotlin

La création d'un projet Kotlin est très simple en utilisant IntelliJ, Eclipse et même la ligne de commande - cependant, pour ce tutoriel, nous allons suivre les étapes d'installation de notre précédent tutoriel Introduction à Kotlin car il contient déjà ce dont nous avons besoin pour nos besoins de démonstration.

3. Les bases

L'appel de Java depuis Kotlin est simple et fluide car il a été construit avec l'idée d'interopérabilité .

Créons cette classe Customer en utilisant le noyau Java:

public class Customer { private String firstName; private String lastName; private int age; // standard setters and getters }

4. Getters et Setters

Travaillons maintenant avec ce simple POJO Java de Kotlin.

Les getters et setters qui suivent la convention Java pour ces types de méthodes sont représentés comme des attributs dans Kotlin:

val customer = Customer() customer.firstName = "Frodo" customer.lastName = "Baggins" assertEquals(customer.firstName, "Frodo") assertEquals(customer.lastName, "Baggins")

Il convient de noter que le nouveau mot clé n'est pas requis pour instancier un objet.

Le langage essaie d'éviter autant que possible le code standard afin que nous n'appelions pas explicitement les getters / setters - nous pouvons simplement les utiliser en utilisant la notation de champ.

Nous devons nous rappeler que si une classe Java n'a que des méthodes setter, la propriété ne sera pas accessible car le langage ne prend pas en charge les propriétés set-only.

Si une méthode retourne void, lorsqu'elle est appelée depuis Kotlin, elle retournera Unit .

5. Sécurité nulle

Kotlin est bien connu pour sa fonction de sécurité nulle, mais comme nous le savons, ce n'est pas le cas pour Java, ce qui le rend peu pratique pour les objets qui en proviennent. Un exemple très simple peut être vu si nous avons un tableau String :

val characterList = ArrayList() characterList.add("Bilbo") val character = list[0]

Kotlin n'affiche aucune erreur de nullabilité au moment de la compilation lorsqu'une méthode est appelée sur une variable d'un type de plate-forme - et ce type ne peut pas être écrit explicitement dans le langage. Ainsi, lorsqu'une valeur est attribuée, nous pouvons nous fier à cette inférence, ou nous pouvons simplement choisir le type que nous attendons:

val a: String? = character val a: String = character

Ils sont tous deux autorisés, mais dans le cas du type non nul, le compilateur affirmera immédiatement lors de l'affectation, ce qui empêchera la variable de contenir une valeur nulle.

En fin de compte, le compilateur fait de son mieux pour éviter les valeurs nulles, mais il est quand même impossible de l'éliminer à cause des génériques.

6. Tableaux

Dans Kotlin, les tableaux sont invariants - ce qui signifie qu'il ne nous permettrait pas d'assigner Array à Array pour éviter les échecs d'exécution.

Nous avons donc un exemple de classe:

public class ArrayExample { public int sumValues(int[] nums) { int res = 0; for (int x:nums) { res += x; } return res; } }

Si nous voulons passer un tableau de primitives à cette méthode, nous devons utiliser l'une des classes spécialisées de Kotlin:

val ex = ArrayExample() val numArray = intArrayOf(1, 2, 3) assertEquals(ex.sumValues(numArray), 6)

7. Varargs

Java nous donne la possibilité de passer n'importe quel nombre d'arguments à une méthode:

public int sumArgValues(int... sums) { // same as above }

Le processus est le même, avec la légère différence que nous devons utiliser l'opérateur de propagation * pour passer le tableau:

assertEquals(ex.sumValues(*numArray), 6)

Actuellement, il n'y a aucune possibilité de passer null à une méthode varargs.

8. Exceptions

Dans Kotlin, toutes les exceptions sont décochées , ce qui signifie que le compilateur ne nous forcera pas à attraper des exceptions:

// In our Java code public void writeList() throws IOException { File file = new File("E://file.txt"); FileReader fr = new FileReader(file); fr.close(); } // In Kotlin fun makeReadFile() { val ax = ArrayExample() ax.writeList() }

9. Réflexion

En termes simples, la réflexion fonctionne à la fois sur les classes Kotlin et Java:

val instance = Customer::class.java val constructors = instance.constructors assertEquals(constructors.size, 1) assertEquals(constructors[0].name, "com.baeldung.java.Customer")

Nous pouvons également obtenir des méthodes getter et setter, une KProperty pour un champ Java et une KFunction pour un constructeur.

10. Méthodes objet

Lorsque des objets sont importés dans Kotlin, toutes les références de type java.lang.Object sont remplacées par kotlin.Any :

val instance = Customer::class val supertypes = instance.supertypes assertEquals(supertypes[0].toString(), "kotlin.Any")

11. Conclusion

Ce tutoriel rapide nous fournit une meilleure compréhension de l' interopérabilité Java de Kotlin . Nous avons examiné quelques exemples simples pour montrer comment Kotlin conduit généralement à un code moins détaillé dans l'ensemble.

Comme toujours, la mise en œuvre de tous ces exemples et extraits de code peut être trouvée sur GitHub.