1. 概要

Kotlin言語がJavaと異なる点の1つは、Kotlinに使い慣れた静的キーワードが含まれていないことです。

このクイックチュートリアルでは、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. コンパニオンオブジェクト

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で呼び出されないようにするために、カスタム名を付けることもできます。

最後に、debugメソッドstaticを再度作成するには、@JvmStaticアノテーションを使用する必要があります。

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

これを使用すると、逆コンパイルされたコードに実際の static final voiddebugメソッドが含まれることになります。

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メソッドの動作を複製する方法を説明しました。 パッケージレベルの関数とコンパニオンオブジェクトを使用しました。

これらすべてのスニペットの実装は、GitHubにあります。