Kotlinに対する雑感

Last updated on

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で作るのは誰なのかなーってボンヤリ思っています。