mizoguche.info

Kotlin 1.2 Betaの新機能おさらいする

Kotlin 1.2 Beta is out | Kotlin Blog

マルチプラットフォームプロジェクト

サーバー・アプリ・Webサイト大統一理論としてのKotlinにちょっと期待しているので見守りたいとの思いを強くした。

KotlinJSちゃんと触らんといかんな…

アノテーション内配列リテラル

Before

@CacheConfig(cacheNames = arrayOf("books", "default"))

After

@CacheConfig(cacheNames = ["books", "default"])

arrayOf がなくなって嬉しいというアレ。

lateinitの改善

初期化されたかチェックできるように

lateinit var file: File

// ...

if (::file.isInitialized) {
    // ...
}

この運用はほぼnullableでは…

トップレベルプロパティとローカル変数でも使えるように

fun test() {
  lateinit var x: Component

  // inject takes a lambda which must return the Component though
  val injector = inject(
    ...,
    componentProvider = { x },
    ...
  )

  // Initialization is only possible via injector, once it has been run
  x = injector.createComponent()
}

なるほど。

thisを省略できる

なるほど。

型推論の改善

AndroidOのfindViewByIdの仕様変更 - Qiitaがコンパイルエラーにならなくなりそう。

警告をエラーにする

compileKotlin {
  kotlinOptions.warningsAsErrors = true
}

治安が良くなるので良い。

スマートキャストの改善

セーフキャストでも上手いことやってくれるように

fun foo(x: Foo?) {
  val b = (x as? SubClass)?.subclassMethod1()
  if (b != null) {
    x.subclassMethod2() // x is smart cast to SubClass
  }
}

ラムダの前に変更されたvar の変数も上手いことできるように

var x: String? = null
if (flag) x = "Yahoo!"

run {
  if (x != null) {
    println(x.length) // x is smart cast to String
  }
}

個人的にはキャストを使う場面というのは設計が良くない兆候だと認識してて、できるだけ避けようとしてるのであんまりお世話になりたくない機能ではある。

キャストを強制されるという複雑な事情がないというのは恵まれた環境なんだろう。

enumのエントリ内のネストされたクラスがdeprecated

enum class Enum {
    ENTRY {
        inner class TestInner         // Ok
 
        class TestNested              // Warning in 1.2, Error in 1.3
   
        interface TestInterface       // Warning in 1.2, Error in 1.3

        object TestObject             // Warning in 1.2, Error in 1.3

        enum class TestEnumClass {    // Warning in 1.2, Error in 1.3
            OTHER_ENTRY
        }
        
        annotation class Ann          // Warning in 1.2, Error in 1.3
    }
}

なるほど。

標準ライブラリ

Java9のモジュールシステムに対応した

魔法…

kotlin.math が追加された

学術的な分野でも存在感を出していきたい…?

まとめ