Kotlinは、バージョン1.1に向けて開発が進められている。 Kotlin言語のリードデザイナ、Andrey Breslav氏は、JetBrain用JVM言語の新バージョンに関するロードマップを説明した。この中で、彼は主な新言語機能について述べている。
Kotlin 1.1はいくつもの新言語機能を提供する。
型エイリアス(type aliases)は、長い型宣言に対する略称指定の仕組みを提供する。 型エイリアスは、新しい型を宣言するものではない。 もともとの型宣言と相互に運用可能な型名を提供するものである。
束縛メソッド参照(bound method references)は、オブジェクトのメンバに対する参照の取得方法を拡張する。 これを使用すると、例えばString
クラスのequals
メソッドに対する参照を取得できる。取得した参照は、別の箇所で、述語として使用可能である。val p: Predicate<String> = “foo”::equals
なお、すでにKotlin1.0.xより、型に対しては、この機能がサポートされている。
委譲されたプロパティ(delegated properties)は、トップレベル(クラスや関数の中)で利用できる。
fun foo() {
val lazyBar by lazy { ... }
while (...) {
if (...) {
lazyBar.doBaz()
...
}
}
}
委譲されたプロパティは、“確実に一度だけ”特定の種類のプロパティを実装するメカニズムである。 たとえば、遅延評価されるプロパティ、観測可能なプロパティ、マップなどに格納されるプロパティなどである。 本機能により、こういったプロパティを、毎回実装する必要がなくなる。
データクラス(data classes)は、継承をサポートする。 これにより、別のデータクラスからの派生が可能となる。 データクラスは、データのみを保持するクラスである。 Kotlinは、データクラスに対し、自動的にアクセサ、equals
、hadhCode
その他共通メソッドを生成する。 データクラスをシールクラス(sealed class)の中で拡張することも可能になる。
sealed class C() {
data class Example(...) : C()
}
デストラクチャリング(destructuring)は、名前の組み合わせをラムダ式の引数として指定できるようにする。以下に一例を示す。 forEach
の引数として値のペアを渡すと、2つのコンポーネント(k、vの2変数)に分解される。
myMap.forEach {
(k, v) ->
println(“$k => $v”)
}
コルーチン(coroutines)は、Kotlinの非同期振る舞いの骨格を提供する。 Breslav氏によれば、コルーチンは、C# 5にて導入されたasync/await
モデルよりも汎用的である。 Kotlinもasync/await
を提供する。 しかし、Kotlinの場合はコルーチンを元に構築されており、プリミティブではない。
fun loadImage(url: URL) = async {
val bytes = await(loadBytes(url))
bytesToImage(bytes)
}
Kotlin1.1は、Java8/9の機能(デフォルトメソッド生成など)を直接サポートする。 加えて、JavaScriptバックエンドが言語機能セットとして取り込まれる。
Kotlinの開発は、Kotlin Evolution and Enhancement Process (KEEP)が主導している。 GitHubリポジトリには全ての計画済みユースケースが記載されている。
Kotlin1.1は旧バージョンに対してソースコード、バイナリのどちらも互換性を維持する。 新バージョンのKotlinコンパイラは、旧バージョンのソースコードやバイナリによって停止することはない。