Interopérabilité Java Kotlin

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.