Kotlinの静的メソッドの動作

1. 概要

link:/kotlin[Kotlin言語]がJavaと異なる1つの方法は、Kotlinにlink:/java-static[the _static_ keyword]が含まれていないことです。 'に精通している。
このクイックチュートリアルでは、KotlinでJavaの静的メソッドの動作を実現するいくつかの方法を紹介します。

2. パッケージレベルの機能

_LoggingUtils.kt_ファイルを作成することから始めましょう。 ここでは、_debug_という非常に単純なメソッドを作成します。 メソッド内の機能についてはあまり気にしないので、単純なメッセージを出力します。
クラス外でメソッドを定義しているため、パッケージレベルの関数を表します。
fun debug(debugMessage : String) {
    println("[DEBUG] $debugMessage")
}
また、逆コンパイルされたコードでは、_debug_メソッドが_static_として宣言されていることがわかります。
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_オブジェクト

Kotlinでは、クラスのすべてのインスタンスに共通のオブジェクト(コンパニオンオブジェクト)を作成できます。 キーワード_companion_を追加するだけで、オブジェクトのシングルトンインスタンスを作成できます。
_companion_オブジェクト内でデバッグメソッドを定義しましょう。
class ConsoleUtils {
    companion object {
        fun debug(debugMessage : String) {
            println("[DEBUG] $debugMessage")
        }
    }
}
逆コンパイルしたコードは、_Companion_オブジェクトを介して_debug_メソッドにアクセスできることを示しています。
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で呼び出されるのを避けるために、__weはカスタム名を付けることもできます。
最後に、_debug_メソッドを再度_static_にするには、_ @ JvmStatic_アノテーションを使用する必要があります。
class ConsoleUtils {
    companion object {
        @JvmStatic
        fun debug(debugMessage : String) {
            println("[DEBUG] $debugMessage")
        }
    }
}
これを使用することで、逆コンパイルされたコードに実際の_static final void debug_メソッドができあがります:
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 _static_メソッドの動作を複製する方法を見ました。 パッケージレベルの関数とコンパニオンオブジェクトも使用しました。
これらすべてのスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/core-kotlin [GitHubで]にあります。