0.初めに
※この記事には筆者の思想が含まれています。
新しくAndroidアプリを作ろうとすると、最初にぶつかるのが「Kotlinにすべきか、Javaのままでいいのか」という問題だ。今さら聞きにくい気もするが、実際まだこれで悩んでいる人は多い。
先に言ってしまうと、新規開発ならKotlinで間違いない。Googleが2017年にKotlinを公式サポート言語に追加し、2019年のGoogle I/Oで「Kotlin First」を打ち出してから、もうかなりの時間が経った。今ではAndroidチーム自身もKotlinで作っていて、Google マップやGoogle Home、Google Driveなど70以上の自社アプリがKotlinベースになっている。Jetpackの新しいライブラリやサンプルコードも、基本的にKotlinが前提だ。
ここでは、なぜそうなったのか、Javaと比べて何が違うのか、そして今でもJavaを選ぶ理由が残っているケースについて書いておく。
1.何がそんなに違うのか
一番よく言われるのはNull安全性の話だ。Javaを書いていると、ある日突然NullPointerExceptionでアプリが落ちる、というのはよくある事故だが、Kotlinでは型の時点でnullを許すかどうかを区別する。
val name: String // nullは入らない
val name: String? // nullも入れられる
これだけでコンパイラがnull関連のミスをかなり拾ってくれる。Google自身も、Kotlinを使ったAndroidアプリはJavaのみのアプリよりクラッシュ率が低いというデータを公開している。Google Homeチームの例では、新機能をKotlinに移行したことでコードベースが3割ほど縮み、NPEによるクラッシュも3割減ったという報告もある。
コード量についても、同じことをするのにKotlinの方が短く書けることが多い。例えばユーザーを1人作るだけなら、
User user = new User("Alice", 20);
val user = User("Alice", 20)
くらいの差で済む話だが、これがプロジェクト全体になると、data classや型推論、拡張関数、ラムダ式といった機能のおかげで、ボイラープレートの差はもっと効いてくる。
非同期処理も大きい。API通信やDB処理、ファイル操作などで非同期コードを書く機会は多いが、Kotlinならコルーチンを使ってこう書ける。
val user = api.getUser()
見た目は同期処理とほとんど変わらない。スレッド管理やコールバックの入れ子に苦しめられることが減る分、後から読む人にとっても保守しやすくなる。
そしてもう一つ大きいのがJetpack Composeだ。今のAndroid UI開発は、XMLでレイアウトを組む昔のやり方から、Composeへの移行がかなり進んでいる。コード量が減る、UIとロジックを一体で書ける、プレビューですぐ確認できるといったメリットがあり、新規プロジェクトでは採用するのがほぼ標準になってきた。ただComposeはKotlinベースで設計されているため、これを使うにはKotlinが前提になる。
2.Kotlin Multiplatformはどこまで来ているか
AndroidだけでなくiOSやデスクトップ、Webまでロジックを共有できるKotlin Multiplatform(KMP)も、ここ数年で状況がかなり変わった。以前はロジックだけ共有してUIは各プラットフォームでネイティブに書く、というのが安全策だったが、Compose MultiplatformのiOS対応が実験段階を抜けて、UIまで含めて本番運用するプロジェクトが増えてきている。完全に「1つのコードで全部動く」というほど万能ではないし、複雑な処理ではネイティブ実装に頼る場面も残っているが、選択肢として現実的になったのは確かだ。これからKotlinを学ぶなら、合わせて押さえておく価値がある分野だと思う。
3.それでもJavaを選ぶ場面
ここまで読むとKotlin一択に見えるかもしれないが、Javaが不要になったわけではない。
一番分かりやすいのは、すでに数十万行、数百万行というJavaのコードベースを抱えているケースだ。これを全部Kotlinに書き換えるコストは普通に見合わない。だから「既存部分はJavaのまま、新しく書く機能はKotlinで」という形で少しずつ移行していくのが現実的な進め方になる。
チーム全体がJavaに慣れていて、短期間で結果を出さなければいけない事情がある場合も、無理にKotlinへ切り替えるよりJavaを続けた方がいいことはある。とはいえ長い目で見れば、いつかKotlinへの移行を検討するタイミングは来ると思っておいた方がいい。
幸い、KotlinとJavaの相互運用性は高い。同じプロジェクトの中に両方混ぜて書けるし、Javaのライブラリはそのまま呼べる。KotlinからJavaのコードを呼ぶのも、逆にJavaからKotlinを呼ぶのも問題ない。Android StudioにはJavaコードをKotlinに変換してくれる機能もあるので、移行のハードル自体は思っているより低い。
4.終わりに
新規でAndroid開発を始めるなら、軸になるのはKotlin、Jetpack Compose、コルーチン、そして余裕があればKotlin Multiplatformあたりだろう。一方で、Javaの知識が無駄になることもない。企業の既存システムでは今でもJavaが現役で動いているし、相互運用性のおかげで両方を使い分けながら開発するチームも多い。
新規ならKotlin、既存資産はJavaも活かしながら、というのが今のところ一番現実的な答えだと思う。