17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

既存のアプリに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のところで、エラーだとのたまいます。
それにだまされて、ずいぶん、悩んでしまいました。

17
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?