Help us understand the problem. What is going on with this article?

Kotlinを導入してやばかったところ

More than 3 years have passed since last update.

この記事は、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

https://youtrack.jetbrains.com/issue/KT-12694

kaptを有効にし、generateStubsを有効にした際、enumに何かしらの引数を取るコンストラクタがある場合にコンパイルが通らなくなるという問題です

source.kt
enum class Hoge(val value: Int){
    E1(1), E2(2);
}

この問題は、Kotlin 1.0.3 で修正されました 👏

この問題に関するコミットはこちらです

(これを書いている時に初めて知りましたが、ケースごとにプロジェクトを作って、それでテストしているんですね・・)

バグ2

https://youtrack.jetbrains.com/issue/KT-9630

ジェネリクスに対して複数の制約をかける際、Kotlinではwhere句を使って制限することができます。

source.kt
// TはComparableでかつSerializableでないといけない
fun <T> hoge() where T: Comparable, T: Serializable

しかし、この関数をTの拡張関数のように

source.kt
fun <T> T.hoge() where T: Comparable, T: Serializable

とするとコンパイルできなくなります。

この問題は、1.1で解決予定だそうです。

言いたかったこと

Kotlinは確かに便利ですが、まだまだバグもたくさんあります。

事前の技術調査では見つけにくい物もあるので、出会った時にうまく回避するか、お祈りをしながら開発をしましょう。

よかったところ

もちろんそれ以上のメリットは受け取れています。

何より、ぬるぽがほぼ完全に消えました。

また、拡張関数のおかげで、通信が終わったらSwipeRefreshのインジケータを消すであったり、ダイアログを消すといった作業などの、Rx周りでのチェーンが書きやすくなりました。

他にもKotlinを入れたことで得られたメリットは数多くあります。

まとめ

バグにさえ出会わなければ非常に便利

ralph
Android App Developer / Android / Minecraft / Xamarin / Java / Kotlin / C#
https://www.ralph.ms/
mspjp
Microsoft製品の楽しさを学生に伝えるために活動する学生団体
http://mspjp.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした