Comportamento dei metodi statici in Kotlin

1. Panoramica

Un modo in cui il linguaggio Kotlin differisce da Java è che Kotlin non contiene la parola chiave statica con cui abbiamo familiarità.

In questo breve tutorial, vedremo alcuni modi per ottenere il comportamento del metodo statico di Java in Kotlin.

2. Funzioni a livello di pacchetto

Iniziamo creando un file LoggingUtils.kt . Qui creeremo un metodo molto semplice chiamato debug . Dal momento che non ci preoccupiamo molto della funzionalità all'interno del nostro metodo, stamperemo solo un semplice messaggio.

Poiché stiamo definendo il nostro metodo al di fuori di una classe, rappresenta una funzione a livello di pacchetto:

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

Vedremo anche nel codice decompilato che il nostro metodo di debug è ora dichiarato statico :

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. Oggetti Companion

Kotlin ci consente di creare oggetti comuni a tutte le istanze di una classe: gli oggetti associati. Possiamo creare un'istanza singleton di un oggetto semplicemente aggiungendo la parola chiave companion .

Definiamo il nostro metodo di debug all'interno di un oggetto associato :

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

Il nostro codice decompilato ci mostra che possiamo accedere al metodo di debug tramite l' oggetto Companion :

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(); } } }

Per evitare di chiamare l'istanza risultante con il nome generico Companion, possiamo anche fornire un nome personalizzato.

Infine, per rendere nuovamente statico il metodo di debug , dovremmo usare l' annotazione @JvmStatic :

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

Usandolo, ci ritroveremo con un metodo di debug del void finale statico effettivo nel nostro codice decompilato:

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(); } } }

Ora saremo in grado di accedere a questo nuovo metodo direttamente tramite la classe ConsoleUtils .

4. Conclusione

In questo breve tutorial, abbiamo visto come replicare in Kotlin il comportamento dei metodi statici di Java . Abbiamo utilizzato funzioni a livello di pacchetto e anche oggetti associati.

L'implementazione di tutti questi snippet può essere trovata su GitHub.