この記事は、Android Advent Calendar 2016の6日目の記事です。
はじめまして、HolidayというサービスのAndroidアプリ開発を行っている @r_ralph_h です。
立ち上げ時から現在まで、ほぼ一人でこのアプリを作っていますが、今年はじめのDroidKaigiでKotlin導入を決め、9月にやっと全書き換えを済ますことができました。
Kotlin導入事例の記事は結構溢れ始めてきているので、せっかくなので導入中に置きたいろいろな事件について書いていきたいと思います。
書き換えまでの推移
(開発主要メンバーが一人&フルコミットではないので、だいぶスピードは遅めです)
2016/04 Kotlinをプロジェクトに導入、モデル部分やUtil系クラスなどの端っこの部分の書き換えを行う
2016/06 FragmentやAdapterなどを書き換え始める
2016/06 apt部分をkaptに置き換える -> 開発中のブランチでビルドが通らなくなる (バグ1)
2016/07 バグ1解決
2016/09 全クラスのKotlin化完了
2016/09 またKotlinのバグを踏む(バグ2)
踏んだバグたち
Stableバージョンになり、比較的安定しているKotlinですが、案外いろいろなところにバグが潜んでおり、上のタイムラインにあるとおり、2つのバグを踏みました。
バグ1
kaptを有効にし、generateStubsを有効にした際、enumに何かしらの引数を取るコンストラクタがある場合にコンパイルが通らなくなるという問題です
enum class Hoge(val value: Int){
E1(1), E2(2);
}
この問題は、Kotlin 1.0.3 で修正されました 👏
この問題に関するコミットはこちらです
(これを書いている時に初めて知りましたが、ケースごとにプロジェクトを作って、それでテストしているんですね・・)
バグ2
ジェネリクスに対して複数の制約をかける際、Kotlinではwhere句を使って制限することができます。
// TはComparableでかつSerializableでないといけない
fun <T> hoge() where T: Comparable, T: Serializable
しかし、この関数をTの拡張関数のように
fun <T> T.hoge() where T: Comparable, T: Serializable
とするとコンパイルできなくなります。
この問題は、1.1で解決予定だそうです。
言いたかったこと
Kotlinは確かに便利ですが、まだまだバグもたくさんあります。
事前の技術調査では見つけにくい物もあるので、出会った時にうまく回避するか、お祈りをしながら開発をしましょう。
よかったところ
もちろんそれ以上のメリットは受け取れています。
何より、ぬるぽがほぼ完全に消えました。
また、拡張関数のおかげで、通信が終わったらSwipeRefreshのインジケータを消すであったり、ダイアログを消すといった作業などの、Rx周りでのチェーンが書きやすくなりました。
他にもKotlinを入れたことで得られたメリットは数多くあります。
まとめ
バグにさえ出会わなければ非常に便利