ジモティーのアプリチームにて、Androidの開発をしている小林真です。
ジモティーではよく勉強会が行われます。
勉強会では、自分が新しく知ったことや、メンバーに知っておいてもらいたいことを中心に話されています。
今回は、1月の社内勉強会で私が発表した、Kotlinについて説明をしたいと思います。
Kotlinとは
- Java言語で書かれたライブラリを呼び出すことができます
- Javaの記述をより短く書けます
- Null安全などJavaにはない安全に書ける仕組みがあります
- AndroidやTomCat等、Javaのフレームワークにも対応しています
Javaでできることをより短く、安全に、便利に書けるようにした言語です。
Javaとの書き方の違い
- 変数
- Javaで型宣言していたところはvar/valに統一できます。
public int i = 1;<-Kotlinではデフォルトのアクセス制限がpublicとなります public MyObject obj = new MyObject();
kotlin
var i = 1 <- 型推測でInt型になります val obj = MyObject() <- newが必要ない val str : String = "foo" <- 型を指定することもできます
val
valはjavaでいうfinal(変数の変更不可)です。
変数を変更不可にし、意図しない変更を行えないほうが良いので、基本的にvalを使い、どうしても後で変更したい変数のみをvarにするのが良いでしょう。
public final String str = "foo"
kotlin
val str = "foo" str = "bar" <- コンパイルエラー
null安全
Kotlinを使う大きな理由の一つです。
「null安全」と聞いて、「nullが存在しない言語」と思うかもしれませんが、そういう意味ではないです。
「nullを入れられない変数」と「nullを入れられる変数」を明確に区別して、nullの影響範囲を最小限にします。
そして、「nullを入れられる変数」にnullを入れて、メソッド参照等をしようとした時(JavaだとNullPointerExceptionになるような動き)、 例外が発生しないような振る舞いをしてくれる仕組みです。
一方、「nullを入れられない変数」にnullを入れようとしたり、nullが入るかもしれない参照をしている場合、コンパイルエラーが出てくれます。
これにより、意図しないnull参照、代入を防ぐことができます。
- Nullが入れられる変数(nullable)には、String?のように?を追加します
- nullableのメソッドを呼び出すには、?.とする必要があります
//var nonNull1 : String = null <- コンパイルエラー var nonNull2 : String = "foo" <- 通る var nullable : String? = null <- 通る var i : Int? = nullable?.length <- 落ちない(nullが入る)
?を!!にすることで「この変数は絶対nullじゃない」と宣言できます。
しかし、NullPointerが発生する穴を生むので、あまり使わない方がいいでしょう。
var nullable : String? = null var i2 = nullable!!.length <- nullPointerException
AndroidでKotlin使ってみた
AndroidはKotlinでも書くことができます。
Javaより使いやすい言語なら、結果的に効率よく開発ができるのではないかと思い、個人で作成しているアプリをKotlin化してみました。
ここでは、良かった点、悪かった点を書きたいと思います。
ここ良かった
- 「とりあえずval」が可能
javaでfinalは目立つし、わざわざつける必要があるので、あまり使っていませんでした。
valなら、一文字しか変わらないので、「これは変更しないな〜」って思って初めてvarにする、といったコードの書き方ができます。
- useが便利
- DBアクセス等で必要なclose処理を勝手にしてくれます
- DBアクセス等で必要なclose処理を勝手にしてくれます
- 開発時にNullで落ちない Java -> Kotlin変換時に!!を使った時以外、Nullによる例外は発生していないです。
- 変数、メソッドが揃ってて見やすい
- fun/var/valとみんな3文字&型記述があとになるため、揃う
- fun/var/valとみんな3文字&型記述があとになるため、揃う
- Scalaみたく重くない
- 型推測がすごい楽
- 型を変えたい時に、いちいち2箇所変える必要がない
- AndroidStudioの言語サポートもJavaと変わらないくらい便利になっています
ここ悪かった
- Kotlin+DataBinding+XMLではまる
DataBindingでミリ秒を時刻表示するためにのDataUtilクラスを使っていました。
Kotlinでは外から見てJavaのStaticメソッドとして扱うには@JvmStaticアノテーションが必要でした。
なのに、「DataBindingの構築に失敗しました」としかでないから、KotlinでDataBindingを使うための設定をいじったりしていました
エラーが出ても丁寧な情報がネットに載ってないので、情報を正しく得る力が必要です
- valとかnull安全とか有効に使うためには、MVCとかMVVMとかの導入が必要かなと思った
AndroidライブラリがJavaなので、Activityに処理を書くと意味がなくなります(JavaライブラリをKotlinで呼び出すときは、Nullableで値が来ます)。
そのため、View層、Model層って分けないとvarや、Nullableの変数ばかり必要になります
勉強会をしてみて
自分一人で勉強していたことを、いざ発表することとなると、結構曖昧に覚えていた知識とかがあり、確認ができていい機会でした。
iOSアプリ開発者の人と、Swiftと似ている所、違うところを話したりして、有意義な時間でした。
Kotlinをジモティーで使うか
チーム内でKotlinに関する知見をためていき、タイミングを見て移行していこうとチーム内でKotlin熱が上がっています。
現状にとどまらず、新しいことをしていくことで自分たちも、新しく入る人達も古いコードを見て悩まないようにしていきたいです。