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のところで、エラーだとのたまいます。

それにだまされて、ずいぶん、悩んでしまいました。