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.activationが maven central にもないので、自分でパッケージングが必要になりそう…
- ただ、
- ライブラリーを作っている人は
META-INF.MFにAutomatic-Moduleをつけてくれ。でないと、jar ファイルの名前がモジュール(Unnamed-Module)になるのでバージョンが変わるたびにビルドが壊れる
たぶん、このメモ読んでも移行できないので、資料を見たほうがよいかもしれない
Project Loom
軽量プロセス Fiber についてのセッション。今回もっとも面白かったセッション。
Fiberは Java の 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.netやjava.nio周りを書き直さないといけない
あまり興奮を伝えられていないが、本当に Fiber 最強やんけという感想しかなかった