Kotlin1.1へのロードマップ

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は、データクラスに対し、自動的にアクセサ、equalshadhCodeその他共通メソッドを生成する。 データクラスをシールクラス(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コンパイラは、旧バージョンのソースコードやバイナリによって停止することはない。