読者です 読者をやめる 読者になる 読者になる

Kotlin勉強会をしました

ジモティーのアプリチームにて、Androidの開発をしている小林真です。

ジモティーではよく勉強会が行われます。

勉強会では、自分が新しく知ったことや、メンバーに知っておいてもらいたいことを中心に話されています。

今回は、1月の社内勉強会で私が発表した、Kotlinについて説明をしたいと思います。

Kotlinとは

https://kotlinlang.org/ f:id:jmty_tech:20170203174553p:plain

  • Java言語で書かれたライブラリを呼び出すことができます
  • Javaの記述をより短く書けます
  • Null安全などJavaにはない安全に書ける仕組みがあります
  • AndroidTomCat等、Javaフレームワークにも対応しています

Javaでできることをより短く、安全に、便利に書けるようにした言語です。

Javaとの書き方の違い

  • 変数
    • Javaで型宣言していたところはvar/valに統一できます。

java

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にするのが良いでしょう。

java

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処理を勝手にしてくれます f:id:jmty_tech:20170203174438p:plain
  • 開発時にNullで落ちない Java -> Kotlin変換時に!!を使った時以外、Nullによる例外は発生していないです。
  • 変数、メソッドが揃ってて見やすい
    • fun/var/valとみんな3文字&型記述があとになるため、揃う f:id:jmty_tech:20170203174527p:plain
  • 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熱が上がっています。

現状にとどまらず、新しいことをしていくことで自分たちも、新しく入る人達も古いコードを見て悩まないようにしていきたいです。