Kotlin Java Interoperabilität

1. Übersicht

In diesem Tutorial werden wir die Interoperabilität zwischen Java und Kotlin diskutieren . Wir werden einige grundlegende Beispiele sowie einige andere komplexere Szenarien behandeln.

2. Kotlin einrichten

Das Erstellen eines Kotlin-Projekts ist mit IntelliJ, Eclipse und sogar der Befehlszeile sehr einfach. In diesem Tutorial folgen wir jedoch den Installationsschritten aus unserem vorherigen Tutorial Einführung in Kotlin, da es bereits das enthält, was wir für unsere Demozwecke benötigen.

3. Die Grundlagen

Das Aufrufen von Java von Kotlin aus ist unkompliziert und reibungslos, da es mit der Idee der Interoperabilität erstellt wurde .

Erstellen wir diese Kundenklasse mit Java:

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

4. Getter und Setter

Lassen Sie uns jetzt mit diesem einfachen Java POJO von Kotlin arbeiten.

Getter und Setter, die der Java-Konvention für diese Arten von Methoden folgen, werden in Kotlin als Attribute dargestellt:

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

Es ist erwähnenswert, dass das neue Schlüsselwort nicht zum Instanziieren eines Objekts erforderlich ist .

Die Sprache versucht, Boilerplate-Code so weit wie möglich zu vermeiden, sodass wir Getter / Setter nicht explizit aufrufen - wir können sie einfach mit der Feldnotation verwenden.

Wir müssen uns daran erinnern, dass, wenn eine Java-Klasse nur Setter-Methoden hat, auf die Eigenschaft nicht zugegriffen werden kann, da die Sprache keine Nur-Set-Eigenschaften unterstützt.

Wenn eine Methode void zurückgibt , gibt sie beim Aufruf von Kotlin Unit zurück .

5. Null Sicherheit

Kotlin ist bekannt für seine Null-Sicherheitsfunktion, aber wie wir wissen, ist dies bei Java nicht der Fall, was es für Objekte, die von ihm kommen, unpraktisch macht. Ein sehr einfaches Beispiel ist zu sehen, wenn wir ein String- Array haben:

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

Kotlin zeigt beim Kompilieren keine Nullabilitätsfehler an, wenn eine Methode für eine Variable eines Plattformtyps aufgerufen wird - und dieser Typ kann nicht explizit in der Sprache geschrieben werden. Wenn also ein Wert zugewiesen wird, können wir uns auf diese Schlussfolgerung verlassen oder einfach den Typ auswählen, den wir erwarten:

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

Sie sind beide zulässig, aber im Fall des Nicht-Null-Typs wird der Compiler bei der Zuweisung sofort bestätigen, wodurch verhindert wird, dass die Variable einen Nullwert enthält.

Am Ende tut der Compiler sein Bestes, um Nullen zu vermeiden, aber es ist dennoch unmöglich, sie aufgrund von Generika zu beseitigen.

6. Arrays

In Kotlin Arrays sind unveränderlich - was bedeutet , dass es uns nicht zu assign erlauben würde Array zu Array - Laufzeitfehler zu verhindern.

Wir haben also eine Beispielklasse:

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

Wenn wir dieser Methode ein Array von Grundelementen übergeben möchten, müssen wir eine der Spezialklassen von Kotlin verwenden:

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

7. Varargs

Java gibt uns die Möglichkeit, eine beliebige Anzahl von Argumenten an eine Methode zu übergeben:

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

Der Prozess ist der gleiche, mit dem kleinen Unterschied, dass wir den Spread-Operator * verwenden müssen , um das Array zu übergeben:

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

Derzeit gibt es keine Möglichkeit, null an eine varargs-Methode zu übergeben.

8. Ausnahmen

In Kotlin sind alle Ausnahmen deaktiviert , was bedeutet, dass der Compiler uns nicht zwingt, Ausnahmen abzufangen:

// 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. Reflexion

Einfach ausgedrückt funktioniert die Reflexion sowohl für Kotlin- als auch für Java-Klassen:

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

Wir können auch Getter- und Setter-Methoden, eine KProperty für ein Java-Feld und eine KFunction für einen Konstruktor erhalten.

10. Objektmethoden

Wenn Objekte nach Kotlin importiert werden, werden alle Referenzen vom Typ java.lang.Object in kotlin.Any geändert :

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

11. Schlussfolgerung

Dieses kurze Tutorial bietet uns ein besseres Verständnis der Kotlin Java-Interoperabilität . Wir haben uns einige einfache Beispiele angesehen, um zu zeigen, wie Kotlin im Allgemeinen insgesamt zu weniger ausführlichem Code führt.

Wie immer finden Sie die Implementierung all dieser Beispiele und Snippets auf GitHub.