最近会社での Android アプリの実装にも Kotlin を使いだしてというもの、記述力がとても高いので気にいってはいる。 特にエクステンションを用いた既存クラスの拡張はとても柔軟性が高く Java だと全てユーティリティメソッドに切っていたものがほとんどエクステンションになり明らかに記述量が減った。 後はトップレベルに関数を定義でき、どこからでもその参照をインポートすれば利用できるのも便利だ。 私はよく使う Bundle を簡単に作成できるような関数をトップレベルに定義して使用している。

ただ、正直もう少し何とかなったのではないか、若しくは Java よりも記述量が増えてしまって微妙に思えるところもあるのも事実だった。 以下 Kotlin を書く方ならご存知の事だと思うが列挙する。

Java のクラスインスタンスを取得する記法

Java のクラスインスタンス、いわゆる Class<T> を取得する記法は Java だと以下のような感じだ:

Hoge.class  // static に取得する場合
hoge.getClass()  // オブジェクトから取得する場合

一方 Kotlin は以下だ:

Hoge::class.java
hoge::class.java

正直見にくい。 そして Android アプリ開発では結構出てくる。

Intent(context, HogeActivity::class.java)

みたいな感じである。 ただ、これを長いから短く書けるようなショートカットを用意すればいいではないか、と思ってやってみたができない。 Kotlin のジェネリクスの型情報も Java と同じくコンパイル後に削除され普通の Object としてしか認識できないので T を受け取って Class<T> を吐くようなメソッドは定義できない (多分)。

配列初期化の記法

Java だと以下のような感じで、変数初期化の際に代入する場合に限り配列のリテラル表記が使用できる:

final String[] arrays = {"hoge", "fuga"};

だが Kotlin には配列のリテラル表記はなく { ... } の役割は代わりにラムダ式 (関数オブジェクト) で使用するようになっている。 Kotlin では arrayOf()intArrayOf() などといった関数を使用する:

val arrays = arrayOf("hoge", "fuga")
val intArrays = intArrayOf(1, 2, 3)

この intArrayOf()booleanArrayOf() などといった感じに Java のプリミティブ型に対応する配列を生成するようのメソッドが別々に用意されているあたりに苦しさを感じる。 とはいえ Java との相互運用性を考えると int[]Integer[] は区別できなければならず、内部的にこうなってしまうのは仕方がない部分かもしれない。