Java
Kotlin
const

Kotlinの定数はJavaではどう見えるかという話

More than 1 year has passed since last update.

既存のアプリにKotlinを導入して、部分的に置き換えているのですが、そこでかるくはまりました。

Javaの定数をKotlinに変換

class Foo {
    static final int Hoge = 1;
    static final int Fuga = 2;
    static final int Piyo = 3;

    ...
}

これを、エイヤッとKotlinに変換すると、

class Foo {
    companion object {
        val Hoge: Int = 1
        val Fuga: Int = 2
        val Piyo: Int = 3
    }

    ...
}

となるわけですが、Java視点で見た場合、この2つは同じではありません。
例えば、変換後のHogeは、Javaからみると、Fooのコンパニオンオブジェクトに定義されたGetterなので、Foo.Companion.getHoge()です。

なので、Javaのswitch()文のcaseなどでは使用できません。

Kotlinの定数

じゃ、どうすればいいでしょうか?

class Foo {
    companion object {
        val Hoge: Int = 1
        const val Fuga: Int = 2
        @JvmField val Piyo: Int = 3
    }

    ...
}

Kotlinのコードをこんな風に変えて、コンパイルした後、デコンパイルしてみたところ、

class Foo {

    public static final class Companion {
        public final int getHoge() {
            return Buzz.Hoge;
        }

        ...
    }

    private static final int Hoge = 1;
    public static final int Fuga = 2;
    public static final int Piyo = 3;
    public static final Companion Companion = new Companion(null);

    ...
}

こんな風になります。
Hoge以外は、Javaからでも定数として使えるようです。

まとめ

  • Kotlinで、 定数 を定義するときは、 const をつけましょう。
  • なにか事情があって、constを使いたくないときは、 @JvmField でもよいです。

おまけ

Android Studio 2.0.0(with Kotlin Plugin)のエディタでは、constをつけても定数と解釈してくれなくて、switch()文のcaseのところで、エラーだとのたまいます。
それにだまされて、ずいぶん、悩んでしまいました。