山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

Kotlin評価

昨年からAndroid開発で一部から注目されていたKotlinですが社内でも話題に出たのでしばらくぶりに情報収集してみました。

まず2月に1.0がリリースされました。正式版です。

またAndroidだけでなくサーバーサイドでの導入検討も進んでいるようでいろいろ試した記事が増えました。アプリ開発とサーバーサイド開発を同じ言語でできるというのは大きな魅力です。Javaとの互換性が高くJavaアプリケーションには比較的問題なく取り入れられそうです。springbootでもJava、Groovy、Kotlinが標準的に選択できるようになっています。

Groovyと何が違うの?という疑問があるのでもう少し詳しく見てみましょう。

その前にJavaとの比較。
Javaは今となっては文法がめんどくさいです。徐々に簡易に書けるように言語仕様が変わってきていますがRubyなどと比べてだいぶ遅れをとっていると思います。もう今さらドラスティックに変えるのは難しいのでしょう。変わると困る人が大勢いるので。もちろんKotlinはセミコロン不要です。これすごい大事。

Rubyとの比較。
Rubyインタープリターという点が大きく違います。Kotlinはコンパイル言語です。Rubyだと関数はソース上、呼び出すところの前に書く必要があります。また型もゆるいです。

Groovyはこれらの点ではKotlinと同じです。Javaと比べて簡潔な書き方がいろいろ用意されています。またRubyと違いコンパイル言語です。Android開発もできます。そうなると後発のKotlinは何がいいのかということになります。

一番の違いはタイプセーフを前提に設計された言語かどうかということです。Groovyは基本的には型なしで使う前提で設計されていると思います。比較的最近@TypeCheckedというアノテーションをつけることで型チェックができるようになりました。しかしもともとが型なしだっただけに、変数を宣言する時defで宣言すると今までどおり型なしになります。簡単に書けたところでもキャストが必要になったりします。それがどういう法則になっているのかよくわからず試行錯誤が必要だったりします。またクラスに後からメソッドを足すようなこと(メタプログラミング)もコンパイルエラーになります。細かいところに後付感があります。

一方のKotlinはもともとタイプセーフなのでGroovyのような支障はないと思われます。

またNull Safetyの仕組みも大きく違うところです。SwiftやJava8でいうoptionalに相当するものです。Groovyにはありません。Java8のoptionalが使えるようですが言語的に強制されないのであまり効果ないように思います。

Kotlinの場合はSwiftよりも洗練されていると思います。Swiftは言語仕様で強制されているのでNullPointerExceptionの防止の観点ではとても手堅い感じになっています。しかしラップしたりアンラップしたりでコードが?や!で若干うっとおしくなります。コーディング中もコンパイラに怒られながら?や!を書く作業をしなくてはなりません。

Kotlinだとif文でnullチェックするとその後はメソッドが使えるようになります。すばらしい。

同様にifで型チェックすると自動的にキャストされてその後はキャストしたクラスのメソッドが書けるようになります。


Kotlinの公式サイトの「Try it」をクリックするとブラウザ上でIDEが開いてサンプルプログラムが動かせます。Examplesの下のProblemsに練習問題が入っています。Kotlin関係なくちょっとした頭のトレーニングになっておもしろいです。