メインコンテンツまでスキップ

Kotlinに対する雑感

Sato Taichi
yak shaver

1.0.0 がリリースされました。やりましたね。

僕の観測範囲内に見えることが増えてきたので、興味本位で少しずつ触っています。

まず、ブラウザだけで試せるチュートリアルが大変素晴らしいので、Kotlin が肌に合うかどうか確認するといいですよ。

js で実装されたエディタなのにシンタックスハイライトだけでなく、入力補完がガンガン効くので凄く良い。

僕の理解

大体 3 日くらいかけて言語仕様やマニュアルの類を読みながらチュートリアルをこなした結果、

  • Kotlin は 安全な次世代の Groovy である

という理解に到達しました。

僕が Groovy に対して持っていた不満は、大体以下の通り。

  • ランタイムがデカ過ぎる
    • groovy-all-2.4.6-indy.jar が 6.5M
  • バイトコードエンハンス等の危険な黒魔術がカジュアルに動く
  • 型がありそうで、実は殆どない
  • 型があまりないのでエディタがどこまでいっても貧弱
  • 開発がいつまで続くか分からない
    • Apache にいったので消える事は無いが開発が緩やかになる可能性は高い

Kotlin はこの不満を全て解消してくれているわけです。

  • ランタイムが小さい
    • kotlin-stdlib-1.0.0.jar が 620k
    • kotlin-runtime-1.0.0.jar が 205k
  • Scala 程ではないが型がある。
    • Java や Groovy より推論してくれるものは多い
  • IntelliJ の結構強力なサポートがある
    • eclipse のプラグインは動く部分もあるが開発リソースが十分に投下されておらず、成長の見込みは少ない
  • JetBrains が頑張る限り開発は続く

安全とは何か

  • Groovy に比べるとコンパイル時に決まることが多い
  • リフクション API は jar ファイルとして分かれている
  • Groovy のRuntime metaprogrammingみたいなことはできない
  • null 許容型と null 非許容型を明示できる
    • null 許容型でも if 文で null チェックすると、その内側では null 非許容型としてコードが書ける。cf. Nullable types
  • 型チェックする if 文を書きさえすれば、その内側では明示的なキャストをする必要が無い。cf. Smart Casts
    • HashMap かどうかチェックした上で Map にキャストするようなコードの存在は許容されるべきではないと考えます
  • 演算子オーバーロードの際にキーワードoperatorが必要。cf. Operators overloading
    • add メソッド作ったせいで意図せずに+演算子をオーバーロードしてしまうみたいな事故はない

Groovy にもあった Kotlin の便利機能

これは、特に僕が好きなやつです。

  • 名前付き引数
  • デフォルト引数
  • 静的に解決される拡張メソッド。cf. Extensions
  • 分割代入 cf. Destructuring declarations
  • 一引数のラムダ式では仮引数と->の両方を宣言せず、暗黙の引数itで使える
  • 引数の最後に関数をとる時、()の外側に{}書ける

最後のはこういう感じ

val ints = 1..3 // 範囲
ints.filter({v -> v > 0}) // 引数にラムダ式をとるfilterメソッド
ints.filter({ it > 0}) // 暗黙の引数itを使って->を省略
ints.filter { it > 0 } // 最後の引数なので()を省略

Kotlin と Java の違い

良い感じに FAQ としてまとまってるので見るといい。

どれをとっても素晴らしい事しか言ってないので、特に書く事は無い。

一方で Java と Kotlin は、一画面に収まる程度にしか大きな違いは無いので Java が分かる人間にとっては極めて学習し易い。

ついでに、Idiomsも確認すると、そのパワーを実感できる。

表にまとまってないもの

この表にまとまってなくて、僕が感銘を受けたというか、そうだよねって思ったのについてつらつら書きます。

まずは、switch-case-defaultが無くなってwhen-elseになっていること。勿論elseは必須だし、分岐部分に色んな式が書ける。cf. When Expression

データを格納する為の貧血気味なオブジェクトを宣言する為の構文があること。 data classがそれ。data class を使うと好きなオブジェクトで分割代入できる。他の言語だとオブジェクトに toTuple みたいなメソッド生やしたりしてたので、大変素晴らしいと思う。cf. Data Classes

まとめ

Kotlin はちょっと触るだけならブラウザだけで動かせますので Java 戦士の皆様は是非触ってみた方が良いでしょう。

歴史的経緯によって残念なことになっている部分が Java にはかなり沢山あるのですけども、それを綺麗さっぱりしたのが Kotlin という感じなので是非流行って欲しい気持ちがあります。

Gradle に変わるビルドツールを Kotlin で作るのは誰なのかなーってボンヤリ思っています。