【Kotlin】@JvmStaticとは
#Kotlin
「注釈された対象はstaticですよ。Java側でもstaticなメソッドとして呼び出すことができますよ」
とコンパイラに教えるためのアノテーション。
code:kotlin
class Main {
companion object {
@JvmStatic
fun main(args: Array<String>) {
println("Hello World")
}
}
}
そもそも、Kotlinには 「staticな変数・メソッド」というものはない。
例えば
code:kotlin
class StringUtils {
companion object {
val EMPTY = ""
}
}
このKotlinで定義された StringUtils#EMPTYと
code:java
class StringUtils {
static String EMPTY = ""
}
Javaで定義されたStringUtils#EMPTYは全くの別物。
Java側のStringUtils#EMPTYはstaticな変数として扱うことができるが、Kotlin側は「コンパニオンオブジェクト内に定義されたEMPTYという名前のプロパティ」という意味でstaticな変数ではない。
KotlinからStringUtils#EMPTYを参照する場合はStringUtils.EMPTYで参照できるが、Javaから参照する場合はStringUtils.Companion.getEMPTY()とコンパニオンオブジェクトを経由して呼び出さなければならない。
これを回避するには、const 修飾する。
code:kotlin
class StringUtils {
companion object {
const val EMPTY = ""
}
}
こうすることで、KotlinでもJavaでもStringUtils.EMPTYで呼び出すことができる。
また、先程も言ったとおり@JvmStaticは「Java側でもstaticなメソッドとして呼び出すことができますよ」という意味なので、
code:kotlin
class StringUtils {
companion object {
@JvmStatic
val EMPTY = ""
}
}
こうすると、Java側では StringUtils.getEMPTY()と呼び出さなければならない。(EMPTYはプロパティ扱い)
ちなみに @JvmStatic const val EMPTY = ""はコンパイルエラーになる。(@JvmStaticなフィールドにはconst定義できないし、逆も然り)
参考
Kotlin で static なメンバーをどう書くべきなのか?