待望の Kotlin 入門書

昨日待望の Kotlin に関する入門書が出版された。 都内のそれなりに大きい本屋に行ってみたが置いていなかったが、私はネットで予約しておいたので当日に入手することができた。 今回はこれの一人読書会を行う。

本書は Java エンジニア、特に Android アプリの開発経験者を対象としています。とはいえ、何かしらプログラミング経験をお持ちの方でしたら、無理なく、興味深く読み進めることができるでしょう。なぜなら……(以下略)

と本の帯にも書かれている。私はそこそこの Android アプリ開発の経験者であり Android 外でも業務系の Java を書いた人間なので対象読者にピッタリはまっている。 Kotlin に関しては Try Kotlin の Kotlin Koans (問題を解いていくと Kotlin の文法が覚えられる例題集) の基本的な部分を解いた程度の知識となっている。なので、以下の読書会の感想もあまりに基本的な部分は省くものとする。Kotlin の基礎文法に関しては Qiita などに幾らでも載っているのでそちらを参照。

第 1 章: ようこそ!Kotlin の世界へ

Kotlin が JetBrains 社によって開発されたことや Scala や Groovy などと同じく JVM 言語であること、Java の設計が最早古いものであり Kotlin がその欠点を克服していること、Kotlin の言語的な特徴、国内の幾つかの Android アプリも既に Kotlin で書かれリリースされていることが書かれている。まぁこの章は読み物として読んでおくだけでいいだろう。

第 2 章: Kotlin を始める

いきなり Hello World のコード例が出てくるが、「クラス」「シグネチャ」「変数」「仮引数」などの用語が説明無しで出てくるし、書き方が Java 経験前提のものになっているので、既に Java 未経験者は厳しい内容になっている気がする。まぁそうでもないとどうしても文章が冗長になってしまって読みにくいのでこれで良いのだが。

Try Kotlin の説明が入る。この Try Kotlin がサンドボックスとして良く出来ていて、先程も述べたように Kotlin の文法を覚える例題集 Kotlin Koans が秀逸だし、Kotlin をその場で書いて実行できる上 Command + Space (Ctrl + Space) でコード補完まで働く。わざわざ IDE をダウンロードする必要がない。

あと CUI コンパイラ (Java でいうところの javac) と REPL (対話的にプログラムを実行できるツール) と IntelliJ IDEA の説明もされているが、実際に Android 開発で使用する際は Android Studio 上で完結するので特に必要はない。また、プログラムを書いて実行するのも上記の Try Kotlin の方が手軽。

第 3 章: Kotlin ガイドツアー

Scala スケーラブルプログラミング (Scala コップ本) からヒントを得て有理数クラスを実装することにより Kotlin のチュートリアルを行うという事らしい:

class Rational (val numerator: Int, val denominator: Int)

コンストラクタありのクラス定義。Java と比べるととてもシンプル。ただこれだけだと toString した結果が hashCode を出力するような不格好なものとなるので以下の様な toString 実装例が書かれていた:

override fun toString(): String = "${numerator}/${denominator}"

override がアノテーションでなくキーワードだし、文字列の変数展開が ${...} で出来るのがやはり良い。 これや関数の定義が Scala や Swift と若干異なるのでこれらの言語を同時に書いていると混乱する。

また、以下のようにイニシャライザを書くことができるらしい:

init {
    require(denominator != 0, {"denominator must not be null"})
}

コンストラクタ内で変数代入以外の処理やチェックを行いたい場合に使えそうだ。 require という構文は assert 的なものらしい。 要するに条件を満たさない場合に IllegalArgumentException がスローされるとのこと。

Kotlin の演算子オーバーロードの書き方は operator fun ... である。 この本には例として operator fun plus(that: Rational): Rational の実装例が記載されていた。

また、Rational(1, 2) + 1 は可能だが 1 + Rational(1, 2) を可能にするために拡張関数が紹介されている。 Scala や Swift にもこういったものがあるが Java だと static なユーティリティメソッドを用意するといった不格好な方法しかないので個人的にこれは嬉しい。

例えば以下のように拡張関数を書くことで追加できるとあった:

operator fun Int.plus(r: Rational): Rational = r + this

第 4 章: 基本的な文法

この章は前の章よりも難易度が下がり Kotlin の基礎の基礎に関する説明が続く。 Kotlin を試し書きしたような人は流し読みでいい気がする。

私が初めて Kotlin を書いて正直戸惑ったのが配列のリテラル表記がないことだ。 例えば多くの言語では [1, 2, 3] などとして配列のインスタンスを書けるが Kotlin は arrayOf(1, 2, 3) などといった関数を使う。 List の場合は listOf(1, 2, 3) だ。 コンストラクタ表記 (例えば ArrayList(1, 2, 3)) ではないのは Java と同じく実装クラスでなくインターフェースを使うという意味だろうが、リテラルで書けないのはイマイチ格好良くない気がする……。 PHP 5.3 以前の array(1, 2, 3) を思い出してしまう (特に古い PHP は何でも連想配列なので度々この array() が出現し読みにくい)。 まぁ勝手に解釈すると arrayOf といった関数にしておくと初期化する要素の内容によって生成する実装クラスを変更できるので有利だ。