mike-neckのブログ

Java or Groovy or Swift or Golang

Java Day Tokyo 2018 のセッションメモ

Java Day Tokyo 2018 に行ってきたので、そのメモ。


キーノート

目黒駅で東京駅南口行きバスのりばを探すのに時間がかかってしまったため、20分遅刻してしまった。

僕が参加したときには Java の新しいリリースモデルの説明。

OpenJDK は 半年間しかサポートしないので、LTSが欲しい場合は Oracle または他のベンダーに頼る感じと思われる。


Updates from the JCP Program

トラブルで最初の10分くらい何を言っているかわからなかった(通訳レシーバーが故障してた)。

JCP/JSR がどういったもので、 Java に貢献するにはどうしていくかという話だった


Project Vallhala

Value Type というプリミティブをフィールドとするデータ型を定義するようにして、その配列が効率的になるようにメモリの持ち方を工夫するというプロジェクト。

これをさらに進めると、ジェネリクスにプリミティブ型を指定できるようになり、 Stream<Integer> とか IntStream ではなく、 Stream<int> のように扱えるようになる。ただ、型の変位については問題があるようで、 int が継承しているクラスは一体何なのかなどの整理が必要である様子。

また、 Unsafe を置き換えるもので VarHandles があるが、それらの概要を示した上で、 JJUG CCC でそのセッションをやるとのことだった。


Curing you Domain Model Anemia with Effective & Clean Tips from the Real World

どういったモデルを書いていけば、集約度の高いクラスが書けるか的な話。DDD好きにはたまらないやつ。

JPAのエンティティを例にサンプルを書いていってたが、僕が普段意識して書いているコードに近いものになってた。

  • コンストラクターではなく、スタティックファクトリーメソッドを提供する
  • エンティティクラスにはデフォルトコンストラクターだけではなく、フィールドに値を突っ込めるコンストラクターも提供する(そのコンストラクターはファクトリーメソッドからのみアクセスする)
  • エンティティクラスの中で特定の値域をもつようなフィールドは、プリミティブな値をそのまま持つのではなく、 Embeddedable クラスを作ってそちらで検証する
  • コレクションフィールドのゲッターは不変(Collections.unmodifiableList() など使って)にしたコレクションを返す。値の追加はこのクラスの中でのみおこなう

Java SE10/11 移行ガイド

すごい混んでたセッション。引っ込み思案なため、席がとれなくて、床に座ってセッションを聞いてた。

雑なまとめ

  • @Deprecated になっている API は使うな。@Deprecated(forRemoval = true) となっているものはまじでなくなるので使うな
  • --add-exports + ALL-UNNAMED/--add-opens などコンパイルオプションが多い
    • モジュール周りはドキュメント自分で読まないと詳しくなれなそう
  • 一つのパッケージを複数のモジュールに組み込めないので、 現在 Java SE にある JAXB/JAX-WSは取り除かれる。使いたい場合は Java EE から提供されているものを使うこと
    • ただ、 javax.activationmaven central にもないので、自分でパッケージングが必要になりそう…
  • ライブラリーを作っている人は META-INF.MFAutomatic-Module をつけてくれ。でないと、jar ファイルの名前がモジュール(Unnamed-Module)になるのでバージョンが変わるたびにビルドが壊れる

たぶん、このメモ読んでも移行できないので、資料を見たほうがよいかもしれない


Project Loom

軽量プロセス Fiber についてのセッション。今回もっとも面白かったセッション。

  • FiberJava の runtime やユーザーコードに支配されるスレッドで、 Thread よりもコストが低く、 OS のスレッドの 1000倍の個数を扱える
  • サーバーなどのリソースの活用の仕方をモニターすると、 セッションの生存期間が長くて数も増えるが、殆どの時間が I/O 待ちでリソースが有効活用されていない
  • 簡単だが性能がよくない同期モデルのプログラミングにするか、複雑になるが高性能の非同期プログラミングモデルにするかの選択しかなかったが、 Fiber を用いると高性能で簡単なモデルのプログラミングが出来るようになる
  • Fiber をこれまでの Thread の上に作るか、 Thread の parent インターフェースとして Strand を作り、 Fiber インターフェースを Strand を継承したものにするか、どちらかがAPI の候補となっている
  • Fiber を使うと、JAX-RS のコードのスループットが5〜10倍になる
  • もしすでに非同期で書いていたら…それを同期に戻すような修正が必要になるかもしれない
  • Fiber を使うと、golang のチャネルや Python のジェネレーターのようなものが作れるようになる
  • Fiberシリアライズして別のJVMに送ってそちらで計算させることができる(coherence のようなデータがある所で処理させるような用途が可能/超長時間のトランザクションなども実現できる)
  • 課題: Fiber に対応させるために既存の java.netjava.nio 周りを書き直さないといけない

あまり興奮を伝えられていないが、本当に Fiber 最強やんけという感想しかなかった