「どこでもKotlin #6 〜Kotlin 1.3の新機能に触れる〜」に参加してきました

  • どこでもKotlin #6 〜Kotlin 1.3の新機能に触れる〜に参加してきました。

m3-engineer.connpass.com

  • 最新のKotlinの話やサーバサイドKotlin、Kotlin/Nativeと幅広い話が聞けて勉強になりました。
  • Kotlin/Nativeは気になりつつもあまり情報収集できていなかったので参考になりました。着実に進歩しているものの今はまだ様子見といった印象ですかね。
  • 後は太郎さんのContractsの説明めちゃくちゃわかりやすかったです。
タイトル 発表者
What's new in Kotlin LINE 藤原 聖
コードで見る Kotlin 1.3 M3 大和 康平
8割完成済みのJavaプロジェクトにKotlinを途中導入した話 M3 川俣 涼
Kotlin/Native 「使ってみた」の一歩先へ M3 星川 貴樹
Kotlin Contracts Ubie 長澤太郎

What's new in Kotlin

  • LINE 藤原 聖さん
  • エムスリー技術顧問

Kotlin Conf 2018

  • JetBrainsが主催
  • 今年で2回目
  • 1300人以上参加
  • 65セッション全て動画公開

www.youtube.com

Keynote

  • Kotlin言語設計者のAndrey
Pragmatic
  • 実用主義
  • 開発者が考えたことをそのままコードにできる

Evolution

  • Keep the language modern
  • Comfortable update
  • 言語をモダンに保ちつつIDEの補完でサポート

Kotlin 1.3 Release

  • 10/29リリース
  • Coroutinesがstable
  • Kotlin/Nativeがbeta
  • Contracts, Inline classes等experimental

最新情報

コードで見る Kotlin 1.3

  • M3 大和 康平さん

Kotlin1.3事始め

  • brew install kotlinで1.3入る

Croutines

  • 軽量なスレッド
  • Croutines builder

Inline Classes

  • コンパイル時にオーバヘッドが少なく展開できる
  • static methodとして展開される
  • プライマリコンストラクタのプロパティ1つまで
  • init文を持てない

標準関数

  • Random
  • isNullOrEmpty/orEmpty
  • Array.copyInto
  • ifEmpty/ifBlank

8割完成済みのJavaプロジェクトにKotlinを途中導入した話

  • M3 川俣 涼さん

JavaプロジェクトにKotlin導入

  • 社内でKotlin導入の流れ
  • 新しい技術への挑戦

進め方

  • 新規追加のクラス/テストはKotlinで

メリット

  • コード量の減少で開発効率アップ
    • data class
  • Null安全がいい
    • nullpo事前に分かるのいい

デメリット

  • なかった
  • 強いて言うなら情報が少ないこと
    • qiitaの記事Java + SpringBootは1250、Kotlin + SpringBootは132
  • Javaコンパイラ周りの知識は必要
    • lombokを使ってるJavaクラスのプロパティを参照できない
    • JavaからKotlinのクラスを参照するとビルドエラー
    • コンパイルの処理順序を知っておくことが必要

Kotlin/Native 「使ってみた」の一歩先へ

  • M3 星川 貴樹

Kotlin/Nativeとは

Kotlin/Nativeの歩み

  • 2017/4登場
    • Cのヘッダーファイルを解釈することできた
  • 2017/11
  • 2018/2
    • MPP対応
  • 2018/4
  • 2018/6
    • JVM, JSのstdlibに
  • 2018/11beta
    • 安定版コルーチンサポート
    • Kotlin1.3

Kotlin/Nativeの使いみち

  • Java資産使えないのに価値あるの?
    • Cのライブラリなら使える
    • iOSならSwift, Objective-Cのライブラリ使える
  • Kotlin stdlibにない機能はどうするの?
    • コルーチン等いろいろ対応されてきてる
  • メモリ管理どうするの?
    • GC独自実装している
    • iOSであればARC値返る
  • 想定される使い道
    • Andoroid, iOS, (Web)の共通モジュール
    • サーバとクライアントのモデルクラスの共通化
    • MVPのMとPをKotlinでVはOSごとのコードで

Kotlin/Native速いの?

  • JVMの方が2倍速い
  • 最適化作業がまだされてないから?

Kotlin/Nativeのこれから

  • MPPで使えるライブラリを使うようにする
  • KotlinライブラリのMPP化
  • iOSエンジニアの理解

Kotlin Contracts

  • Ubie 長澤太郎

従来のKotlin

  • 便利な関数があるのにスマートキャストできない
    • !name.isNullOrBlank()と書くと
      • Nullableな変数をnullでないと確認した後はNonNullで扱いたい
      • 文脈的に明らかにnull出ない場合でもコンパイラがエラーという
      • name != nullって書かないと行けなかった
      • これが1.3からちゃんと動くようになる

Contracts

  • 事前条件
    • 関数の利用者が条件を満たす
  • 事後条件
    • 関数を呼び出した後の状況を関数が保証する
    • ex. List#addしたらlengthが1増える
  • 不変条件
    • オブジェクトが満たすべき状態を維持する
  • Contractsは事後条件の部分
    • しかも静的に

対応してる標準関数

  • 引数がtrueを保障
    • assertTrue
    • check
    • require
  • 引数がfalseを保障
    • assertFalse
  • 引数がNotNullを保障
    • assertNotNull
    • checkNotNull
    • requireNotNull

従来のKotlin2

  • val変数の初期化が絶対成功するはずなのにできない
  • ラムダの中での初期化はは一度だけしか呼ばれないのに分かってくれない
    • これが1.3からちゃんと動くようになる
  • InvocationKind
    • AT_MOST_ONCE
    • EXACTRY_ONCE
    • AT_LEAST_ONCE
    • UNKNOWN

契約DSLまとめ

  • contract: 関数の先頭
  • returns(): 関数が成功したら..
  • returns(Any?): true/false/nullを返したら..
  • callsInPlace: 関数が呼ばれる回数を保障する
contract {
  returns(true implies (arg != null)
}
contract {
  callsInPlace)block, InvocationKind.EXACTRY_ONCE)
}