まだJavaで消耗してるの?Android開発ならKotlinでしょ!

Kotlin

エンジニアのたかです。Androidアプリの開発を担当しています。

Tokyo Otaku Mode(以下 TOM)のEC用のAndroidのアプリ(Otaku Shop)では、半年ほど前からKotlinを導入しています。
以前は、70億のデバイスで動くJavaという言語を100%使ってAndroidアプリ開発をしてましたが、現状では約70%をKotlinで書いています。
githubの分布
今回は、Kotlinを実際に導入して分かったメリットとデメリットをまとめてみました。

Kotlin導入のメリット

コードが読みやすい!

Javaと比較して、記述量も減りますので、すっきりとしたコードになり、コードの全体像を掴みやすくなりました。

AndroidでViewにOnClick処理を追加するコードの、JavaとKotlinの比較です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Java
TextView textView = (TextView) findViewById(R.id.text);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 処理
}
});

// Kotlin
var textView = (findViewById(R.id.text) as TextView).apply {
setOnClickListener {
// 処理
}
}

今までの単調なJavaとは別物です。

Kotlinのコードを書きやすくする機能としては

  • 型推論
  • ラムダ式
  • Smart Casts
  • Null Safety
  • アクセサメソッドの自動生成
  • クロージャ
  • 中置呼び出し
  • Collections

と、出しきれないほどあります!Java8がAndroid Nからサポートされるので、記述量が減らせるなどはKotlinに限った話ではないかもしれませんが、半年前の導入時点では大きなきっかけになりました。現に、Kotlinに置き換えてからコードの確認がしやすくなっています。

拡張関数(Extension Functions)と 拡張プロパティ(Extension Properties)

拡張関数は、クラスの拡張などをしなくても後から、指定のクラスに対して新しい関数を定義することができます。
拡張プロパティも、クラスの拡張などをしなくても後から、指定のクラスに対して新しいプロパティを指定することができます。
ただ、拡張プロパティは新しいフィールドを指定して値を保存できるわけでないので注意が必要です。

Javaを書いていた時はなんとも思いませんでしたが、使っていると本当に良さがわかりました。
運用で後からスッと関数を足すときに便利です!Javaだと親クラスまで影響を及ぼしたり、思っている以上に修正範囲が多くなりがちです。動作確認やテストコードの修正範囲が多くなったりします。が、拡張関数を使うことで、クラスと関数の関係性を壊すことなく、新しく関数を定義できるので、処理の流れがつかみやすくなります。個人的にはRecyclerViewのBind処理で別処理をしたくなった時などに使用しています。また、あると使いたくなります(笑)

拡張プロパティについてはBacking Fieldsが使えないので、どのように使うのがいいのかわかりづらかったですが、最近参加した勉強会で以下のような使い方ができることを知って使用する幅が広がっています。

1
2
3
// Int型の拡張変数で日付データを生成して返す。
val Int.day: Calendar
get() = Calendar.getIncetanse().set(Calendar.Date, this)

Javaと互換性があるので、途中からの導入もしやすい!

既存のプロジェクトにも導入しやすいのは本当に良いです!まずは、新しいクラスファイルからKotlinを使ってみるのも良いかと思います。実際TOMのアプリもJavaとの併用で使っています。JavaからKotlinを呼び出す時と、KotlinからJavaを呼び出すときに迷ってしまうことが最初はちょくちょくありました(汗)
ですが、Qiitaに良い記事があるので一読すれば、問題ないかと思います。

開発がJetBrainsなのでサポートが手厚い

JetBrainsがKotlinをサポートしているのとオープンソースなので、そうそう開発が止まることもないですし、手広くサポートもされるだろうと感じます。現にJetBrainsからankoなどのKotlin用の強力なライブラリなども出ており、それを使うためにKotlinにしてもよいかと思います。

Kotlin導入でのデメリット

学習コスト

新しい言語を習得するので、学習コストは確実にかかります。特に僕はラムダ式で躓きました。ですが、Javaのこうしたかった!を、Kotlinが上手いこと吸収していますので、AndroidアプリをJavaで書ける方でしたら、スムーズに習得できると思います。また、Swiftをやっている方だと構文が似ているので特にスムーズに学べるのではないかなと思います。KotlinとSwiftを同時にかいていたりすると、混乱してしまいますが。。。(funとかfuncとか、letとかvalとか。。。)

検索結果がまだまだ少ない

ネットでの検索結果がまだまだ少ないです。Javaと比べると結果は悲惨です。(Javaという言語は幅が広いので比べるべきではないのかもしれないですが。(汗))

検索結果が少ないのは、それだけ情報が少ないということになります。これは新しく言語を習得する上で、障壁になりやすいです。(導入時のエラーが分からずに挫折とか。。Kotlinを使った時のJunitの書き方がわからないとか。。)
僕個人は情報を発信することが得意ではないですが、頑張ってきます。

Googleトレンド

ですが、QiitaStackOverFlowでもタグもあり多くの投稿もされています。また、SlackのGroup(kotlinlang, kotlinlang-jp)もあり、質問や討論できる状態になっています。

配列の定義が気持ち悪い

これだけは、どうしてこうなった?と思っています。自分自身そこまでプログラミング言語に詳しくないので、色々な事情があったんだろうとは思っていますが、、う〜ん。
種類が多いのと、初期化の方法が多いです。使い慣れてくるとわかってくるのですが、初回で躓きやすいです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// map
val map: Map<String, String> = mapOf("a" to "b") // read only
val hashmap: HashMap<String, String> = hashMapOf( "a" to "b")
val hashmapClass: HashMap<String, String> = HashMap()

// list
val list: List<String> = listOf() // or arrayListOf() read only
val mutableList: MutableList<String> = arrayListOf()
val linkedlist: LinkedList<String> = LinkedList()

// array
val array: Array<String> = arrayOf()
val arrayList: ArrayList<String> = arrayListOf()
val arrayListClass: ArrayList<String> = ArrayList()

まとめ

メリットとデメリットを挙げさせていただきましたが、結果としてはKotlinを導入してよかったかなと思っています。日々コード量が増えているので、Kotlinにしたことによってコードの確認、機能追加、バグ発見などがしやすくなったことは良い改善でした。
Android Nのこともあり、もしKotlinの導入を迷っている方がいれば、Kotlinの公式ブログでKotlinのRoadmapに関する記事が出たので、一読してみると良いかと思います。また、最近ではGoogleがAndroidの開発でJavaをやめるという記事で、Kotlinが採用されるかも説も出ています!

1.0.0が出て盛り上がっているKotlinですが、もっともっと盛り上げたいと個人的には本気でおもっているので、Kotlinエンジニアの方々頑張りましょう!

[おまけ] Kotlinもくもく会を開催しています

Kotlinはまだ新しい言語なので、知見を広げたり困っていることを相談できる場所になればいいなと思いもくもく会を開催しています。
第1回目を3月17日に行いました。当日は、はじめてKotlinを触る人や、すでにKotlinを触っている人、などなど10人くらい参加していただけました。

Kotlin勉強会で出た質問だと、

  • ラムダ式で書けるInterfaceと書けないInterfaceがある。
  • KotlinのLintはどうしてます?
  • internalとprivateのスコープの違い
  • nullの対処法はどうしてます?

などの話し合いがされました。

次回もTokyo Otaku Modeの会場で開催する予定ですので、Kotlinの知見を集めたいなとか気になっている方はぜひ参加してください!
次回の開催は、明日4月27日(水)の19時から〜弊社で行います。
Kotlin.apk もくもく会#2