Kotlin 1.0リリース記念勉強会 in 京都に行ってきた

はじめに


界隈の情報を収集しておきたかったので行ってきました

結論的なところを言ってしまうと、
もうプロダクトに放り込んでも良さそうという印象でした
(kobaltやKotolin for JSのようなエコシステムはまだまだですが・・・)

とはいえ、多少は混ぜるな危険(nullとか)もあるようなので
ビジネスロジックデータクラス(所謂JavaBeanとか)からやり進めたほうがいいかなという感覚です
(swiftでobj-C混ぜて大変なことになったのは、大体一年前の話w)

AndroidだとActivityとかコアなところをやるのではなくロジック周りからかな
# 新規に作る場合、その限りではない

JetBrainsさん、ロードマップ出すぐらいに本気!!
(大したことでは無いが唯一の懸念としてあるとすれば、Androidに限ればGoogle本家のサポートでは無いというところぐらいかな)

SIerアーキテクト視点でみたKotlinの紹介


期待

  • 新しく覚えることを少なくできる
  • 一番期待しているのは後方互換性(コンパイラは古いバイナリを使える)

機能

  • NullSafe(no-null type / nullable type)
    • 言語レベルでnull safeサポート
    • Java8のOptionalは使い勝手がよくなかった(バッドコードが生まれやすかった)
  • Dataクラス
    • valueオブジェクトとして使ったほうがよい
  • smartcast
    • ソースの文脈で、判断してくれる
    • 型分岐で処理するのがやりやすい(instanceof & キャストしなくていい)
  • extension
    • 既存クラスを拡張することが可能
      • swiftとだいたい同じ
  • delegation
    • インターフェースだけ可能
    • 移譲プロパティ
      • 遅延評価とか可能
  • 演算子のオーバーロード
    • BigDecimapを演算子で計算可能

まとめ

  • 実用的で使いやすい
  • 後方互換性がある(サポートすることを名言している)
  • webで勉強できる

kotilinはじめました


  • scalaとかswiftやってれば似ているのでやりやすい
  • scalaのoptionalとkotolinのnull safeは似ているようで微妙に違う
  • scalaからbetter javaを抜き出してシュリンクした感じ
  • 言語仕様が少ないので覚えやすい
  • scalaの入り口にはなりやすい(基本構文が似ていることがいい)
  • swiftっぽい感(構文似ているけど、違うことはそれなりにある)
  • ?:はエルビス演算子(scalaのgetOrElse)って言うんだよ!

kotlinとjavaee


  • インジェクションがちょっと面倒そう(明示的に)
  • none null型にはcdiで注入するのが面倒
    • コンストラクタで初期化するとか
    • lateinit修飾子をつけるとか工夫が必要
  • JAX-RSはjavaのコードをそのままで
    • 継承するためにopenアノテーション必要
  • JPA
    • static fieldはcompanionオブジェクトにする(static backing field)
  • 混ぜるな危険はあんまり無さそう
    • どう書くかというのは悩むことは非常に多いかも
  • 少しずつkotolinに置換は現実的かも
  • 古いドキュメントが多いので注意

springboot + kotlin


  • springbootでkotlinが使えるようになった模様
  • DIはlateinit使え!
  • JRebel(ホットスポットVMかな)
    • 問題無く動く
  • Spring AOP
    • finalになっているのでopenにすることが必要
    • @Beanはfunc hoge() = “hoge”でかけるとおもいきやopen
  • getter/setter書かなくてよいのですっきり
  • none null対策にはいい
    • @NonNullアノテーションは書かないやつでてくるので、none nullを強制できる

kotlinとモダンライブラリを使ってアプリを作る


  • dagger2と相性良さそう
    • そこそこ記述量が減ってる
    • 登壇者もActivity書いたりやcontextの引き回しは気になる模様
  • databinding
    • プロパティクラス使えばいい
    • java同様に普通に使える
    • lazyやnone null、delegateでデータ作らないと表示されないかも
  • property observer
    • 変更監視可能なプロパティ
    • ListViewとかで有効
      • データが更新される
  • binding adapter
    • JvmStaticアノテーションでstaicなメソッドになる
  • value converter
    • kotolinでは使えなかった模様
    • javaで書くしかない
  • JetBrainのankoというライブラリが素敵
    • context, serviceとかに便利拡張がある
    • dslはデータバインディングと組み合わせは辛い(相性があまり良くない模様)
  • ハマりどころあるものの大体使える
    • Javaのライブラリもそのまま使える模様

Kotlinこんなん出ましたけど


  • kotlin as JS
    • JVM側はメジャーリリースで仕様が大体固まった
    • JSはもうちょい変更入る
  • kobalt
    • gradleライク
    • kobaltプロジェクトを参考するといい模様
    • ドキュメント生成可能だけど、フォーマット
  • エコシステムも作ろうとしている模様
    • Androidだけに注力している訳ではない

Dataクラスから始めるKotlin / JetBrains行ってきたよ!


  • groovy柔軟性を引き換えにパフォーマンスと型安全が犠牲
  • scalaは別の世界
  • kotolinはスムーズ
  • lombokプラグインは時々壊れる
  • データクラスからの以降がよい
  • ロジックに集中して、細かいところを以降していくといい
  • java to kotlinはたまに失敗することがある
    • コンバート後のコンパイルに失敗
    • 修正過程で勉強になるとポジティブに捉えるといいかも
  • Jankinsでビルドががが
    • サブモジュールの.ktが見つからない
  • 突然のillegalstateexception
    • javaの世界からnullが渡されると起きる
    • javaからも使うフィールドはnone nullにするか慎重になる必要
  • おしいところ
    • shift + commnad + enterが効かない
  • ゆるやかに以降できる
  • データオブジェクトとかビジネスロジックから手をつけて以降するのがオススメ

攻めるラムダ式禁止おじさん


  • 関数参照を使えば、ラムダ式を消せる
  • 引数を取らないものもできる
  • 引数を2つとるものは、かりー化
  • メソッド参照
  • java的なメソッド参照は使えないけど、かりー化使えば対応可能
  • ラムダ式をきちんと使う方向で・・・