Kotlin Java-interoperabiliteit

1. Overzicht

In deze tutorial gaan we de interoperabiliteit tussen Java en Kotlin. We gaan enkele basisvoorbeelden behandelen, evenals enkele andere, meer complexe scenario's.

2. Kotlin opzetten

Het maken van een Kotlin-project is heel eenvoudig met IntelliJ, Eclipse en zelfs de opdrachtregel - maar voor deze tutorial volgen we de installatiestappen van onze vorige tutorial Inleiding tot Kotlin omdat het al heeft wat we nodig hebben voor onze demo-doeleinden.

3. De basis

Het aanroepen van Java vanuit Kotlin is eenvoudig en soepel, omdat het is gebouwd met het idee van interoperabiliteit.

Laten we dit maken Klant klasse met behulp van core Java:

openbare klasse Klant {private String firstName; private String achternaam; privé int leeftijd; // standaard setters en getters}

4. Getters en Setters

Laten we nu aan de slag met deze eenvoudige Java POJO van Kotlin.

Getters en setters die de Java-conventie voor dit soort methoden volgen, worden in Kotlin als attributen weergegeven:

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

Het is vermeldenswaard dat de nieuw trefwoord is niet vereist voor het instantiëren van een object.

De taal probeert standaardcode zoveel mogelijk te vermijden, dus we noemen getters / setters niet expliciet - we kunnen ze gewoon gebruiken met behulp van de veldnotatie.

We moeten onthouden dat als een Java-klasse alleen setter-methoden heeft, de eigenschap niet toegankelijk zal zijn omdat de taal geen alleen-set-eigenschappen ondersteunt.

Als een methode terugkeert leegte dan wanneer het vanuit Kotlin wordt gebeld, zal het terugkeren Eenheid.

5. Nul-veiligheid

Kotlin staat bekend om zijn null-veiligheidsfunctie, maar zoals we weten, is dit niet het geval voor Java, waardoor het onpraktisch is voor objecten die eruit komen. Een heel eenvoudig voorbeeld is te zien als we een Draad matrix:

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

Kotlin geeft geen nullability-fouten weer tijdens het compileren wanneer een methode wordt aangeroepen op een variabele van een platformtype - en dit type kan niet expliciet in de taal worden geschreven. Dus wanneer een waarde wordt toegewezen, kunnen we vertrouwen op deze gevolgtrekking, of we kunnen gewoon het type kiezen dat we verwachten:

val a: String? = tekenval a: String = teken

Ze zijn allebei toegestaan, maar in het geval van het niet-null-type, zal de compiler onmiddellijk beweren bij toewijzing, waardoor wordt voorkomen dat de variabele een null-waarde bevat.

Uiteindelijk doet de compiler zijn best om nulls te vermijden, maar toch is het onmogelijk om het te elimineren vanwege generieke geneesmiddelen.

6. Arrays

In Kotlin zijn arrays invariant - wat betekent dat we niet kunnen toewijzen Array naar Array om runtime-storingen te voorkomen.

Dus we hebben een voorbeeldklasse:

openbare klasse ArrayExample {openbare int sumValues ​​(int [] nums) {int res = 0; for (int x: nums) {res + = x; } return res; }}

Als we een reeks primitieven aan deze methode willen doorgeven, moeten we een van de gespecialiseerde klassen gebruiken van Kotlin:

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

7. Varargs

Java geeft ons de mogelijkheid om een ​​willekeurig aantal argumenten door te geven aan een methode:

public int sumArgValues ​​(int ... sums) {// hetzelfde als hierboven}

Het proces is hetzelfde, met het kleine verschil dat we de spread-operator moeten gebruiken * om de array door te geven:

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

Momenteel is er geen mogelijkheid om te passeren nul naar een varargs-methode.

8. Uitzonderingen

In Kotlin zijn alle uitzonderingen niet aangevinkt, wat betekent dat de compiler ons niet zal dwingen om uitzonderingen op te vangen:

// In onze Java-code gooit public void writeList () IOException {File file = new File ("E: //file.txt"); FileReader fr = nieuwe FileReader (bestand); fr.close (); } // In Kotlin plezier makeReadFile () {val ax = ArrayExample () ax.writeList ()}

9. Reflectie

Simpel gezegd, reflectie werkt op zowel Kotlin- als Java-klassen:

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

We kunnen ook getter- en setter-methoden verkrijgen, een KProperty voor een Java-veld en een KFunctie voor een constructeur.

10. Objectmethoden

Wanneer objecten in Kotlin worden geïmporteerd, worden alle verwijzingen van het type java.lang.Object verander in kotlin:

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

11. Conclusie

Deze korte tutorial geeft ons een beter begrip van de Kotlin Java-interoperabiliteit. We hebben enkele eenvoudige voorbeelden bekeken om te laten zien hoe Kotlin over het algemeen tot minder uitgebreide code leidt.

Zoals altijd is de implementatie van al deze voorbeelden en fragmenten te vinden op GitHub.