Verhalten statischer Methoden in Kotlin

1. Übersicht

Eine Art und Weise, in der sich die Kotlin-Sprache von Java unterscheidet, besteht darin, dass Kotlin nicht das statische Schlüsselwort enthält, mit dem wir vertraut sind.

In diesem kurzen Tutorial sehen wir einige Möglichkeiten, um das statische Methodenverhalten von Java in Kotlin zu erreichen.

2. Funktionen auf Paketebene

Beginnen wir mit der Erstellung einer LoggingUtils.kt- Datei. Hier erstellen wir eine sehr einfache Methode namens Debug . Da uns die Funktionalität unserer Methode nicht besonders wichtig ist, drucken wir einfach eine einfache Nachricht.

Da wir unsere Methode außerhalb einer Klasse definieren, handelt es sich um eine Funktion auf Paketebene:

fun debug(debugMessage : String) { println("[DEBUG] $debugMessage") }

Wir werden auch im dekompilierten Code sehen, dass unsere Debug- Methode jetzt als statisch deklariert ist :

public final class LoggingUtilsKt { public static final void debug(@NotNull String debugMessage) { Intrinsics.checkParameterIsNotNull(debugMessage, "debugMessage"); String var1 = "[DEBUG] " + debugMessage; System.out.println(var1); } }

3. Companion Objekte

Mit Kotlin können wir Objekte erstellen, die allen Instanzen einer Klasse gemeinsam sind - den Begleitobjekten. Wir können eine Singleton-Instanz eines Objekts erstellen, indem wir einfach den Schlüsselwort- Begleiter hinzufügen .

Definieren wir unsere Debug-Methode in einem Begleitobjekt :

class ConsoleUtils { companion object { fun debug(debugMessage : String) { println("[DEBUG] $debugMessage") } } }

Unser dekompilierter Code zeigt uns, dass wir über das Companion- Objekt auf die Debug- Methode zugreifen können :

public final class ConsoleUtils { public static final ConsoleUtils.Companion Companion = new ConsoleUtils.Companion((DefaultConstructorMarker) null); public static final class Companion { public final void debug(@NotNull String debugMessage) { Intrinsics.checkParameterIsNotNull(debugMessage, "debugMessage"); String var2 = "[DEBUG] " + debugMessage; System.out.println(var2); } private Companion() {} public Companion(DefaultConstructorMarker $constructor_marker) { this(); } } }

Um zu vermeiden, dass die resultierende Instanz mit dem generischen Namen Companion aufgerufen wird, können wir auch einen benutzerdefinierten Namen angeben.

Um die Debug- Methode wieder statisch zu machen, sollten wir die Annotation @JvmStatic verwenden :

class ConsoleUtils { companion object { @JvmStatic fun debug(debugMessage : String) { println("[DEBUG] $debugMessage") } } }

Wenn wir es verwenden, erhalten wir eine tatsächliche statische endgültige Debug- Methode für nichtig in unserem dekompilierten Code:

public final class ConsoleUtils { public static final ConsoleUtils.Companion Companion = new ConsoleUtils.Companion((DefaultConstructorMarker) null); @JvmStatic public static final void debug(@NotNull String debugMessage) { Companion.debug(debugMessage); } public static final class Companion { @JvmStatic public final void debug(@NotNull String debugMessage) { Intrinsics.checkParameterIsNotNull(debugMessage, "debugMessage"); String var2 = "[DEBUG] " + debugMessage; System.out.println(var2); } private Companion() {} public Companion(DefaultConstructorMarker $constructor_marker) { this(); } } }

Jetzt können wir direkt über die ConsoleUtils- Klasse auf diese neue Methode zugreifen .

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie das Verhalten statischer Java- Methoden in Kotlin repliziert wird . Wir haben Funktionen auf Paketebene und auch Begleitobjekte verwendet.

Die Implementierung all dieser Snippets finden Sie auf GitHub.