Interopérabilité Java Kotlin
1. Vue d'ensemble
Dans ce tutoriel, nous allons discuter desinteroperability between Java and Kotlin.. Nous allons couvrir quelques exemples de base ainsi que d'autres scénarios plus complexes.
2. Configurer Kotlin
Créer 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 tutoriel précédentIntroduction to Kotlin car il contient déjà ce dont nous avons besoin pour notre démo fins.
3. Les bases
Calling Java from Kotlin is straightforward and smooth since it was built with the idea of interoperability.
Créons cette classeCustomer 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 les setters qui suivent la convention Java pour ces types de méthodes sont représentés sous forme d'attributs dans Kotlin:
val customer = Customer()
customer.firstName = "Frodo"
customer.lastName = "Baggins"
assertEquals(customer.firstName, "Frodo")
assertEquals(customer.lastName, "Baggins")
Il est intéressant de noter quethe new keyword is not required pour instancier un objet.
Le langage essaie d'éviter autant que possible le code passe-partout afin d'éviter d'appeler explicitement les getters / setters. Nous pouvons simplement les utiliser en utilisant la notation de champ.
Nous devons nous rappeler que si une classe Java ne comporte 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 renvoievoid, lorsqu'elle est appelée depuis Kotlin, elle retourneraUnit.
5. Sécurité nulle
Kotlin est bien connu pour sa fonctionnalité de sécurité nulle, mais comme nous le savons, ce n'est pas le cas pour Java, ce qui le rend impraticable pour les objets qui en proviennent. Un exemple très simple peut être vu si nous avons un tableauString:
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 affectée, nous pouvons nous fier à cette inférence ou 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 tout de même impossible de les éliminer à cause des génériques.
6. Tableaux
Dans les tableaux Kotlin, les tableaux sont invariants - ce qui signifie que cela ne nous permettrait pas d'assignerArray<Int> àArray<Any> 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;
}
}
If we want to pass an array of primitives to this method, we have to use one of the specialized classes 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 d'étalement* pour passer le tableau:
assertEquals(ex.sumValues(*numArray), 6)
Actuellement, il n’est pas possible de transmettrenull à une méthode varargs.
8. Exceptions
In Kotlin all exceptions are unchecked, 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.example.java.Customer")
Nous pouvons également obtenir des méthodes getter et setter, unKProperty pour un champ Java et unKFunction pour un constructeur.
10. Méthodes d'objet
Lorsque des objets sont importés dans Kotlin, toutes les références de typejava.lang.Object sont changées enkotlin.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 desKotlin Java Interoperability. Nous avons examiné quelques exemples simples pour montrer comment Kotlin aboutit généralement à un code moins détaillé.
Comme toujours, l'implémentation de tous ces exemples et extraits de code peut être trouvéeover on GitHub. Ceci est un projet basé sur Maven, il devrait donc être facile à importer et à exécuter.