昨日の夜から雨が降っていて、朝もまだパラパラしてたのですが、朝ご飯を食べ終わって店を出たら虹が出てました。
さて、今日は Appreciation Event で Elton John と Beck のライブがあるので、セッションは少なめ。
- CON7823 jshell: The New Interactive Java Language Shell for JDK 9
- CON2709 The New HTTP Client API, Including HTTP/2 and WebSocket
- CON7432 New Trics for Old Dogs: Collections Enhancements in Java 8
- CON5118 Introduction to Modular Development
- CON6936 Understanding Java Garbage Collection
- CON1667 Effective Exceptions and Java 8 Streams
GC のセッションは初心者向けであまりおもしろくありませんでした。スピーカーの Gil Tene は Azure の人なので、Azure ならではの話が聞けると思ったのですが...
CON7823 jshell: The New Interactive Java Language Shell for JDK 9
Java にとうとう REPL が導入されることになったわけです。それが jshell。
個人的には、そんなにうれしくないのですが、ちょっと試してみたいとか教育目的にはいいかもしれません。ついでですが、@bitter_fox くんは OpenJDK の jshell プロジェクトのコミッタです。
スピーカーは、その jshell プロジェクトのリードの Robert Field。セッション中に @bitter_fox くんもコミッタとして紹介されていました!
jshell がどういうツールかという説明はあるのですが、なぜ今 REPL なのかなどの背景などはあまり説明がなく... 本当はこういうところが重要なんですけどねぇ。
まぁ、その代りデモはいっぱいやってくれましたけど。
jshell で書くのは Java のスニペットで、クラスなどをちゃんと書く必要はありません。スクリプト言語的に記述ができるわけです。もちろん、クラスを書くこともできますけど。
jshell の組み込みコマンドは /help で一覧が表示されます。リストを表示するとか、保存するとか、定義したメソッドの一覧を表示することなどができるようです。
実装がなかなかおもしろそう。コードのスニペットだとしても、それを補ってクラスにしてしまい、その都度コンパイルと実行を行っているようです。この法式だとパフォーマンスは悪くなりますけど、REPL でパフォーマンスのことをいってもしかたないですね。
ちょっとした用途には、いいかも。
CON2709 The New HTTP Client API, Including HTTP/2 and WebSocket
因縁の HTTP Client のセッションです。というのも、HTTP Client は Java SE 8 で導入予定だったのですが、スリップしてしまったのでした。当時、期待していたので、スリップは残念だったことを思い出します。
スピーカーは Oracle の Michael McMahon。
前半が HTTP/2 の説明で、後半が API の説明なのですが、一番はじめは CompletableFuture クラスについて。ようするに、新しい HTTP Client は CompletableFuture クラスをベースに作られているということです。
CompletableFuture クラスは処理を関数で表し、メソッドチェーンでつなげていきます。そのおかげで、今までのURLConnectionクラスよりも格段に使いやすそうですし、プロパティなども設定しやすいようです。
WebSocket も同じように使えそう。これは期待が持てるかも。
そういえば、このセッション、珍しくてらださんと一緒でした。
セッションの後、てらださんが「なんであんなめんどうくさいことするんですか。Java EE の WebSocket はアノテーションだけで指定できるのに」というわけです。
こういうところがてらださん、分かってないんだよなぁ。
Java SE は他のエディション、特に Java EE のベースになるエディションなわけです。つまり、Java EE から見たら、下位の API に相当します。
下位の API は上位の API に対して、必要十分な機能を提供しなくてはなりません。設定項目などもすべてちゃんと設定できなくてはならないわけです。それに対し、アノテーションでコードを自動生成する法式だと、上位の API から使いにくくなってしまうわけです。しかも、デバッグもやりにくくなるし。
だからというわけではないと思いますが、Java SE ではほとんどアノテーション使いません。@Override ぐらい。
Java SE と Java EE の立ち位置の違いをちゃんと理解してほしいなぁ > てらださん
CON7432 New Trics for Old Dogs: Collections Enhancements in Java 8
Java SE 8 でのコレクションフレームワークの変更点について。
スピーカーは Oracle の Stuart Marks。
コレクションに関しては、例年、Michael Duigou がスピーカーだったのですが、今回は壇上にはいるものの、話はせず。役割が変わったんですかねぇ。
Stuart は自分の資料にハッシュタグつけて、ツィートしてねというんだけど、あんまりツィートで実況する人はいないんですよね。日本だったら、当たり前のようにやってますけど、海外ではそんなことないのかな?
さて、コレクションですが、Java 8 で大きく変化しました。もちろん、Stream の存在もそうなのですが、それよりも何よりも影響が大きいのがデフォルトメソッドです。
コレクションはインタフェースで定義されているので、おいそれとは機能が追加できなかったのですが、デフォルトメソッドによって機能を追加することができることになりました。そのおかげで、List や Map に新しいメソッドがいっぱい追加されました。特に、Map。
というわけで、デフォルトメソッドで追加されたメソッドを半分以上の時間をかけて説明しています。たとえば、Map の getOrDefault とか putIfAbsent などなど。
後は、コレクションでよく使用する Comparator。Comparator もいっぱいメソッドが追加されています。
最後にちょっとだけ Java 9 の変更について。
ファクトリメソッドの of がコレクションにも追加されます。変更不可でイミュータブルなコレクションを作成できるようなので、Arrays.asList のコレクション版のような感じです。ついでですが、of メソッドでは null は使えません。イミュータブルだったり、null を要素にとれないというのは、安全性や、パラレルで使うことを考えたら当然ですね。
Map にも of メソッドがあって、キーと値を順々に並べていく感じです。これはちょっとわかりにくいような気が。タプルがあればいんですけどね。Map.Entry を生成する entry というメソッドもできるようなので、これを使っても書けます。
Java のコレクションは生成して、値を設定するのがめんどうなので、こういうファクトリメソッドはほんとうれしいです。
CON5118 Introduction to Modular Development
このセッションのスピーカは Alan Bateman。昨日も Alan のセッション受けているし、毎日会っていますww
それにしても、Jisaw のセッションをいろいろ聞いた後に Itroduction を聞くのは、ほんとにセッションの取り方を間違えたとしかいえないです。
JavaOne で聞いていた時は頭のなか疑問符だらけだったのですが、家に帰って整理してやっと理解できた感じ。
基本的なところで、勘違いしていたのが、モジュールは JMOD ファイルだと思っていたこと。去年までは JMOD ファイルだったんですよ。でも、今年は JAR ファイルでモジュールを表せるようになったのでした。
JAR ファイルの説明ばかりして、モジュールはいつ出てくるんだろうと思っていたのですが、そもそもそれが勘違いだったわけです。
でも、去年からの差分では説明してくれないので、全然気が付かなかったわけです ^ ^;;
さて、モジュールは JAR ファイルにモジュールの定義情報を組み合わせたものだということが分かりました。では、そのモジュール定義をどこに書くかということですが、それは module-info.java というファイルに書きます。ここら辺も去年とは変わったところです。というか、元に戻ったというべきか。
module-info.java にはモジュールが依存しているモジュールと、公開するパッケージを記述します。依存性は Maven などと同じような感じ。パッケージはデフォルトでは非公開で、たとえ public なクラスであったとしても、外部からアクセスできないようになります。で、module-info.java に公開する (exports する) と指定したパッケージだけが、外部からアクセスできるようになるわけです。
そして、標準ライブラリもモジュールに分割されます。モジュールはかなり多いです。
実行やコンパイル時は -classpath ではなくて、-modulepath を使用します。-cp とは違って、-mp はディレクトリを指定します。-mp で指定されたディレクトリにあるモジュールのうち、依存性で芋づる式にモジュールをロードしていくようです。
困ったのが jar コマンドのオプションが全然見られないものになっていること。--create とか --file とかになってます。確かに、今までの cfv とかは、UNIX の ar とか tar を使っていない人にはなんのことかさっぱり分からないですから、こっちの方がいいのかも。
最後にちょっとだけ jlink の紹介。これはすでに書いたからいいでしょう。
ということで、やっと分かったような気がする。
CON1667 Effective Exceptions and Java 8 Streams
Stream を使っていて困るのが、例外の扱い。そもそも java.util.funtion パッケージの関数型インタフェース群が例外返さないように定義されていることが問題なわけです。もちろん、そうしたのは理由があるわけですが、例外を扱うのが面倒になったのは事実です。
で、このセッションになるわけです。
スピーカは Benjamin Weber。
例外がスローできないといっても、できないのはチェック例外です。なので、よく使われる手としては RuntimeException にくるんで、スローする方法。
でも、メインに紹介したのが Either を使う方法。簡単にいえば、値もしくは例外を保持するコンテナクラスです。Optional の例外版のような感じですかね。
ただちょっと面倒くさいかな。正常に動作した場合を書いていかなくてはいけないんですよね。ここらへんも Optional のめんどうなところと似ています。
0 件のコメント:
コメントを投稿