- どこでもKotlin #6 〜Kotlin 1.3の新機能に触れる〜に参加してきました。
m3-engineer.connpass.com
- 最新のKotlinの話やサーバサイドKotlin、Kotlin/Nativeと幅広い話が聞けて勉強になりました。
- Kotlin/Nativeは気になりつつもあまり情報収集できていなかったので参考になりました。着実に進歩しているものの今はまだ様子見といった印象ですかね。
- 後は太郎さんのContractsの説明めちゃくちゃわかりやすかったです。
What's new in Kotlin
Kotlin Conf 2018
- JetBrainsが主催
- 今年で2回目
- 1300人以上参加
- 65セッション全て動画公開
www.youtube.com
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
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を途中導入した話
JavaプロジェクトにKotlin導入
進め方
メリット
- コード量の減少で開発効率アップ
- Null安全がいい
デメリット
- なかった
- 強いて言うなら情報が少ないこと
- qiitaの記事Java + SpringBootは1250、Kotlin + SpringBootは132
- Javaのコンパイラ周りの知識は必要
Kotlin/Native 「使ってみた」の一歩先へ
Kotlin/Nativeとは
Kotlin/Nativeの歩み
- 2017/4登場
- 2017/11
- 2018/2
- 2018/4
- 2018/6
- 2018/11beta
Kotlin/Nativeの使いみち
- Java資産使えないのに価値あるの?
- Kotlin stdlibにない機能はどうするの?
- メモリ管理どうするの?
- 想定される使い道
- Andoroid, iOS, (Web)の共通モジュール
- サーバとクライアントのモデルクラスの共通化
- MVPのMとPをKotlinでVはOSごとのコードで
Kotlin/Native速いの?
- JVMの方が2倍速い
- 最適化作業がまだされてないから?
Kotlin/Nativeのこれから
- MPPで使えるライブラリを使うようにする
- KotlinライブラリのMPP化
- iOSエンジニアの理解
Kotlin Contracts
従来のKotlin
- 便利な関数があるのにスマートキャストできない
!name.isNullOrBlank()と書くと
- Nullableな変数をnullでないと確認した後はNonNullで扱いたい
- 文脈的に明らかにnull出ない場合でもコンパイラがエラーという
name != nullって書かないと行けなかった
- これが1.3からちゃんと動くようになる
Contracts
- 事前条件
- 事後条件
- 関数を呼び出した後の状況を関数が保証する
- ex. List#addしたらlengthが1増える
- 不変条件
- Contractsは事後条件の部分
対応してる標準関数
- 引数がtrueを保障
- 引数がfalseを保障
- 引数がNotNullを保障
- assertNotNull
- checkNotNull
- requireNotNull
従来のKotlin2
- val変数の初期化が絶対成功するはずなのにできない
- ラムダの中での初期化はは一度だけしか呼ばれないのに分かってくれない
- InvocationKind
- AT_MOST_ONCE
- EXACTRY_ONCE
- AT_LEAST_ONCE
- UNKNOWN
- contract: 関数の先頭
- returns(): 関数が成功したら..
- returns(Any?): true/false/nullを返したら..
- callsInPlace: 関数が呼ばれる回数を保障する
contract {
returns(true implies (arg != null)
}
contract {
callsInPlace)block, InvocationKind.EXACTRY_ONCE)
}