Поведение на статични методи в Котлин

1. Общ преглед

Един от начините, по който езикът Kotlin се различава от Java, е, че Kotlin не съдържа статичната ключова дума, с която сме запознати.

В този бърз урок ще видим няколко начина за постигане на статичното поведение на Java в Kotlin.

2. Функции на ниво пакет

Нека започнем със създаването на файл LoggingUtils.kt . Тук ще създадем много прост метод, наречен отстраняване на грешки . Тъй като не се интересуваме много от функционалността в нашия метод, просто ще отпечатаме просто съобщение.

Тъй като дефинираме метода си извън клас, той представлява функция на ниво пакет:

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

Също така ще видим в декомпилирания код, че нашият метод за отстраняване на грешки е деклариран като статичен :

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. Придружаващи обекти

Kotlin ни позволява да създаваме обекти, които са общи за всички екземпляри на клас - придружаващите обекти. Можем да създадем единичен екземпляр на обект само чрез добавяне на ключовата дума companion .

Нека дефинираме нашия метод за отстраняване на грешки в придружаващ обект:

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

Нашият декомпилиран код ни показва, че можем да осъществим достъп до метода за отстраняване на грешки чрез обекта 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(); } } }

За да избегнем извикването на получения екземпляр с родово име Companion, можем да дадем и потребителско име.

И накрая, за да направим метода за отстраняване на грешки отново статичен , трябва да използваме анотацията @JvmStatic :

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

Използвайки го, ще получим действителен статичен окончателен метод за отстраняване на грешки в нашия декомпилиран код:

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

Сега ще можем да осъществим достъп до този нов метод директно чрез класа ConsoleUtils .

4. Заключение

В този кратък урок видяхме как да репликираме в Kotlin поведението на статичните методи на Java . Използвали сме функции на ниво пакет, а също и придружаващи обекти.

Изпълнението на всички тези фрагменти може да бъде намерено в GitHub.