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