サーバーサイドのjavaアプリケーションを半年近くちまちまとkotlinに変換しています。多少はコツも掴めてきたので、メモ。
Intellij IDEAを使う
kotlinなんだから当然ですね。
変換
IDEAには、Javaコードをkotlinに自動変換する機能があるので、基本的にはそれを呼び出すだけです。ただし、自動変換できない・失敗するケースがいくつかあります。
その1:lombok
lombokは素敵なものですが、kotlinとの相性は悪いです。@Data,@Setterアノテーションなどlombokでコード生成しているjavaコードをkotlinから呼び出すことはできません。javaコードの修正が必要となります。IDEAの場合、"delombok"でlombokで生成されているコードをソースに展開してくれます。ちなみに、lombok使用のままでもIDE上では即時にはエラーにはならずに、ビルド時に失敗するので、最初はかなり悩みました。
その2:stream
streamで少し複雑な処理を記述しているとだいたい失敗します。手作業でちまちまと直します。コードがすごくすっきりして嬉しかったりする。
kotlinコードをjavaから呼び出す:static
kotlinには、javaのstaticメソッドが存在しません。companion object内のメソッドがそれに対応します。@JvmStatic アノテーションを付けることで、javaコードからstaticメソッドのように呼び出すことができます。
companion object {
@JvmStatic
fun valueOf(value: Int?): Int {
kotlinコードをjavaから呼び出す:例外
javaからkotlinを呼び出す場合で、送出する例外を明示する場合は、@throwsアノテーションを使います。
@Throws(SQLException::class, IOException::class)
fun func() {
}
@Nonnull / @Nullableアノテーションを使う。
全てのコードがkotlinであればいいのですが、そうはいかないことが多いと思います。javaのコードには @Nonnull/@Nullable アノテーションでnull可能性を明示することで、呼び出すkotlin側で意図しないnull例外の発生を防ぐことができますし、コンパイルエラーで弾いてくれます。
メソッドのパラメーターへの再代入はできない
パラメーターは不変なので、再代入はできません。例えばこんなコードはエラーとなります。
fun func(s: String) {
s = s.toUpperCase() // ERROR!
}
別の変数を割り当てましょう
fun func(sParam: String) {
val s = sParam.toUpperCase()
}
とりあえずここまで。