Die Instanz eines Objekts in Kotlin ermitteln

David Mbochi Njonge 30 Januar 2023
  1. Verwenden Sie is mit Generics, um die Instanz eines Objekts in Kotlin abzurufen
  2. Verwenden Sie is mit dem Schlüsselwort when, um die Instanz eines Objekts in Kotlin zu erhalten
  3. Fazit
Die Instanz eines Objekts in Kotlin ermitteln

Das Abrufen der Instanz eines Objekts ist eine gängige Entwicklungspraxis, der wir in den meisten Programmiersprachen wie Kotlin, Java, TypeScript, JavaSript und anderen begegnen werden. Ein Beispiel für eine Situation, in der Sie möglicherweise die Instanz eines Elements finden möchten, ist, wenn Sie Elemente basierend auf ihrem Typ sortieren möchten.

Wenn die Instanz eines Elements gefunden wird, ist das Ergebnis wahr, wenn das Element den gleichen Typ hat wie das Element, mit dem abgeglichen wird; andernfalls wird false zurückgegeben.

In diesem Tutorial erfahren Sie, wie Sie mit Kotlin die Instanz eines Objekts zur Laufzeit abrufen.

Verwenden Sie is mit Generics, um die Instanz eines Objekts in Kotlin abzurufen

Generic ist ein Entwicklungsansatz, der verwendet wird, um unseren Code so zu entwerfen, dass er mit jedem Typ wiederverwendet werden kann.

Gehen Sie zu IntelliJ und wählen Sie Datei > Neues Projekt, um ein neues Kotlin-Projekt zu erstellen. Geben Sie den Projektnamen als kotlinInstancOf oder einen beliebigen Namen ein.

Wählen Sie Kotlin im Abschnitt Sprache und Intellij im Abschnitt Build-System aus. Klicken Sie auf die Schaltfläche Erstellen, um das Projekt zu erstellen.

Sobald das Projekt erstellt ist, erstellen Sie die Ordnerstruktur com/instanceOf unter dem Ordner kotlin. Erstellen Sie eine Datei mit dem Namen Main.kt im Ordner instanceOf und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein:

package com.instanceOf

interface Employee{
    fun work(): String;
}
class Manager(private val name: String): Employee{
    override fun work(): String {
        return "$name is preparing the project schedule";
    }

}
class Janitor(private val name: String): Employee{
    override fun work(): String {
        return "$name is cleaning the office";
    }

}
fun <T> doWork(Object: T): String {
    if (Object is Employee){
       return Object.work();
    }else{
        throw RuntimeException("$Object is not of type Employee")
    }
}

fun main() {
    println(doWork(Manager("John")));
    println(doWork(Janitor("Peter")));
    println(doWork("mary"));
}

In diesem Beispiel haben wir eine Schnittstelle namens Employee und zwei konkrete Implementierungen namens Manager und Hausmeister erstellt.

doWork() ist eine oben definierte generische Methode, die das Schlüsselwort is verwendet, um herauszufinden, ob das als Argument übergebene Objekt vom gleichen Typ wie Employee ist. Wenn die Bedingung wahr zurückgibt, rufen wir die work()-Methode des Objekts auf; andernfalls werfen wir eine RuntimeException().

In der Hauptmethode rufen wir die Methode doWork() dreimal auf und übergeben jeweils den Manager, den Hausmeister und einen String als Argumente.

Die ersten beiden Aufrufe der Methode werden als wahr gewertet, da sie eine Beziehung zum Employee haben. Der letzte Aufruf wird aber als falsch ausgewertet, da das String-Argument keine Beziehung zum Employee hat.

Führen Sie den Code aus, um zu überprüfen, ob die Ausgabe wie unten gezeigt ist.

Exception in thread "main" java.lang.RuntimeException: mary is not of type Employee
John is preparing the project schedule
Peter is cleaning the office

Da das Schlüsselwort is einen booleschen Wert zurückgibt, können wir die Umkehrung des Schlüsselworts is zurückgeben, indem wir das Zeichen ! hinzufügen. vor dem Schlüsselwort. Der Charakter ! wird normalerweise als nicht ausgesprochen, was bei der Arbeit mit Logikgattern üblich ist.

Kommentieren Sie die Methode doWork() und ersetzen Sie sie durch den folgenden Code:

fun <T> doWork(Object: T): String{
    if (Object !is Employee){
        throw RuntimeException("$Object is not of type employee");
    }
    return Object.work();
}

Führen Sie den Code erneut aus und beachten Sie, dass das Ergebnis mit der Ausgabe im vorherigen Beispiel identisch ist:

John is preparing the project schedule
Peter is cleaning the office
Exception in thread "main" java.lang.RuntimeException: mary is not of type employee

Verwenden Sie is mit dem Schlüsselwort when, um die Instanz eines Objekts in Kotlin zu erhalten

Das Schlüsselwort when funktioniert genauso wie das Schlüsselwort switch mit Java. Der einzige Unterschied ist die Syntax.

Kommentieren Sie das vorherige Beispiel und kopieren Sie den folgenden Code und fügen Sie ihn nach dem Kommentar in die Datei Main.kt ein.

fun fetchData() = listOf<Any>("book",3,true,"computer");

fun main() {
    for (data in fetchData()) {
        when(data){
            is String -> println(data)
            is Int -> println(data)
            is Boolean -> println(data)
        }
    }
}

Im obigen Beispiel haben wir eine Methode fetchData() erstellt, die eine Liste vom Typ Any zurückgibt, indem wir sie der Hilfsmethode listOf() zuweisen. Die Methode listOf() gibt eine Liste mit den Typen String, Int und Boolean zurück.

In der Methode main haben wir den Elementtyp zur Laufzeit ermittelt, indem wir die Liste mit einer Schleife durchlaufen und jeden Wert an die Methode when() delegiert haben. Innerhalb des when()-Blocks wird der Typ des übergebenen Werts mit is bestimmt, und wenn die Bedingung als wahr ausgewertet wird, wird der Wert in der Konsole protokolliert.

Beachten Sie, dass der Wert nicht in der Konsole protokolliert wird, wenn Sie der Liste einen anderen Typ hinzufügen, ohne dessen Typ im when()-Block zu finden.

Führen Sie den Code aus und vergewissern Sie sich, dass die Ausgabe wie unten gezeigt aussieht:

book
3
true
computer

Fazit

In diesem Tutorial haben wir gelernt, wie man die Instanz eines Elements zur Laufzeit erhält, indem man die Programmiersprache Kotlin nutzt. Zu den behandelten Ansätzen gehören: Verwenden des Schlüsselworts is mit Generika und des Schlüsselworts is mit dem Schlüsselwort when.

Beachten Sie, dass wir bei der Verwendung von Generika sicherstellen müssen, dass wir reifizierte Typen verwenden, was bedeutet, dass die Typinformationen zur Laufzeit verfügbar sind; Andernfalls funktioniert die Typprüfung nicht.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

Verwandter Artikel - Kotlin Object