Kotlinというプログラミング言語を用いたAndroid開発が今注目を集めています。
本シリーズではKotlinとそのAndroid開発への導入を紹介します。
Kotlinとは
Kotlin(コトリン)とは静的型付けのプログラミング言語の一つです。2016年2月にバージョン1.0がリリースされたばかりの若い言語です。オープンソースで、InteliJ IDEAで有名なJetBrains社が開発を主導しています。
JVM(Java仮装マシン)上で動作するJVM言語(他にはScala、Groovy等)であるという点が特徴です。
100% interoperable with Java
Kotlin公式のトップに飾られているフレーズです。interoperableとは相互運用という意味です。
すなわち、Javaで書かれたコードをKotlinから呼び出すことも、Kotlinで書かれたコードをJavaから呼び出すことも可能ということです。これはJavaの既存の資産を活用できることを意味します。
若い言語なだけあってモダンな言語仕様を多く取り入れており、Javaに比べて非常に書きやすくなっています。
感覚的にもSwiftに近く、iOS開発者は馴染みやすいはずです。
Why Kotlin?
すでにJavaによる開発が標準であるところになぜKotlinを導入するのか。
端的に言えば、Javaではどうしても冗長になる記述を改善し、かつプログラムの安全性を高めるためです。
具体的な例を幾つか挙げましょう。
null安全(Null Safety)
null安全こそKotlinを採用する最大の理由と言っても過言ではありません。
まずnull安全とはなんでしょうか。簡単に言えば実行時にnullによって生じるエラーを防ぐ仕組みです。
例えば次のJavaのコードを見てみましょう。
String message = null; int l = message.length();
Javaではこのようにnullのメンバにアクセスしようとすると、実行時に悪名高きNullPointerExceptionを吐きます。
Kotlinはこの問題を解決するために、nullが入り得る型(null許容型)とnullが入り得ない型(null非許容型)の明確な区別を言語機能として提供しています。
val nullable: String? = null val notNull : String = null //コンパイルエラー
型に?をつけるとnull許容型になります。null非許容型にnullを代入しようとするとコンパイルエラーになります。
val length = nullable?.length
null許容型のメンバにアクセスするときは必ずチェックが必要です。
val length = nullable.length //コンパイルエラー val length = nullable?.length
このようにコンパイルの段階でnullによる危険を検知できるためnullによる不用意な実行時エラーを防ぐことができるのです。
ちなみに、このnull安全という言語仕様は、SwiftやTypeScript等他の言語でも実装されています。
今後はKotlinに限らずnull安全を使うことが標準となっていくのではないでしょうか。
シンプルな記述
Kotlinはモダンな言語仕様を取り入れており、Javaに比べシンプルな記述が可能です。
シンプルさは記述が楽になるだけでなく、可読性も向上させます。
幾つかの例をとってそのシンプルさを見てましょう。
型推論
Kotlinは型推論が働きます。
String msg = "Hello"; final int num = 1; User user = new User();
変数を宣言するときは型の宣言が必須ですよね。
Kotlinでは次のように記述できます。
var msg = "Hello" val num = 1 var user = User()
型推論が働くため明示的な型宣言をする必要がありません。また、finalを用いずにvarとvalの使い分けで再代入不可の区別が済みます。
プロパティ
Kotlinにはプロパティの仕組みが備わっており、とても記述がシンプルになります。
Javaではプロパティを現すには次のように記述することが推奨されています。
フィールドはprivateとし、getter/setterをpublicで用意するというものです。
class User { private String name = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } }
User user = new User(); user.setName("Alice");
Kotlinでは次のように書けます。
class User(var name : String = "")
val user = User() user.name = "Alice"
一見すると(Javaで言うところの)フィールドを直接触っているようにも見えますが、実は内部的にアクセサを作成しておりそのアクセサを経由しています。
このようにプロパティが言語仕様として提供されているおかげで非常に簡潔な型定義ができるます。
関数リテラル
Kotlinは関数リテラルを用いて関数を第一級オブジェクトとして扱うことができます。
加えてSAM(SingleAbstractMethod: メソッド定義が一つだけ)インターフェースを引数に取るメソッドに関数リテラルを渡すと、SAMインターフェースに変換してくれます。
これによりAndroidで多く書くことになるイベントリスナーの記述がとても簡潔になります。
次のコードはAndroidでおなじみのボタンにクリックイベントのリスナーを登録するコードです。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.v("tag", "clicked"); } });
ボタンを押された時の処理を書きたいだけなのに本質的でない部分が多いですよね。
Kotlinなら下のコードで済んでしまいます。
button.setOnClickListener { v -> Log.v("tag", "clicked") } //さらに省略可能 button.setOnClickListener{ Log.v("tag", "clicked")}
とてもすっきりとしてボタンの押下処理という本質にフォーカスしやすくなっています。
ここに挙げたこと以外にも拡張関数、デリゲート、プライマリコンストラクタ、クロージャ等便利な仕様を有しており、非常に書きやすい言語となっています。
Android開発でJavaという言語由来の部分で不便を感じているなら、導入を検討してみてはいかがでしょうか。
次回はAndroid開発へのKotlinの導入の流れを紹介します。