この記事は新世代Javaプログラミングガイドの紹介(Java 10編)の続きです。
##Java 11での変更点
Java 11では以下の6つについて書かれています。
- ラムダパラメータのローカル変数構文
- Epsilon GC ― ガベージコレクタの改良
- HTTP クライアント API
- ZGC - 低遅延化とスケーラビリティの改善
- フライトレコーダとミッションコントロール
- JDK 11 のその他の改良点
###ラムダパラメータのローカル変数構文
Java 11でLambda式のパラメータでvarが使えるようになりました。
というと「あれ? Lambda式のパラメータは元々型宣言はなくてもよかったんじゃ?」と思う人もいるかもしれません。
確かにLambda式では
(int age) -> x > 100;
(age) -> x > 100;
x -> x > 100;
のような記述ができ、1番目以外は型の指定を省略しています。
そしてパラメータでvarが使えるということは
(var age) -> x > 100;
のような書き方ができるとういうことです。
ちなみにvarを使った場合
var age -> x > 100;
のように ()
を省略することはできません。
先ほどの例ではvarを使うことのメリットはありませんが、varを使えることで 型宣言をせずに アノテーションを付与することができるようになります。
つまり
@Nullable var name -> name.length() > 32;
のような記述ができるということです。varが使えない場合、具体的な型宣言をせずにアノテーションを使うことはできませんでした。
本ではこのような話について詳しく説明されています。
###Epsilon GC ― ガベージコレクタの改良
Epsilon GCとは「ガベージコレクトしない GC」です。
なんか矛盾したものに感じますが、Epsilon GCはメモリを開放しいので、アプリケーションがヒープメモリを使いつくすとJVMは皆さんご存じの OutOfMemoryError
で終了します。
こんなEpsilon GCですが有用ないくつかの場面があります。
###HTTP クライアント API
Java 9で非標準のライブラリとして登場し、Java 10で修正が行われさらにJava 11で標準化されたHTTP クライアント APIについて詳しく説明されています。
Javaには1.1の時代からHttpURLConnectionクラスというのがありましたが、なぜ新たなHTTPライブラリの開発に至ったのかという解説から各クラスのメソッド一覧、具体的なコード例のサンプルまで初歩的な内容から具体的にかなり詳しく解説されています。
普段HTTP クライアントを使った開発を行っていない開発者にもわかりやすい内容となっていると思います。
###ZGC - 低遅延化とスケーラビリティの改善
Java 11ぽの実験的なGCとしてリリースされたZGC(Z ガベージコレクタ)についての説明です。
アプリケーションの遅延が10ミリを超えないことを約束したZGCの特徴やその仕組み、実際にZGCを使用するにあたってのコマンド例、オプションについて解説されています。
###フライトレコーダとミッションコントロール
高性能で低オーバーヘッドなプロファイラでJVMに組み込まれているJFR(Java フライトレコーダ)と、JFFが記録したデータの解析のためのツールであるJMC(Java ミッションコントロール)について、チュートリアル的に実際に使用する例を使って解説されています。
アプリケーションがクラッシュしたり予想外の動作をしている時に、原因調査のためにこれら知識が役立つでしょう。
###JDK 11 のその他の改良点
その他の改良点については以下の項目について説明されています。
- ネストに基づくアクセス制御
- 動的クラスファイル定数
- AArch64 イントリンシックの改善
- Java EE と CORBA モジュールの削除
- Curve25519 と Curve448 での鍵合意(Key agreement)
- Unicode 10
- ChaCha20 と Poly1305 の暗号アルゴリズム
- 単一ファイルソースコードのプログラム起動
- TLS 1.3
- Nashorn JavaScriptエンジンの廃止
- pack200 ツールと APIの廃止
どれも簡単に解説されているだけですが、単一ファイルソースコードのプログラム起動など(IDEを使わない場合に特に)便利な機能については知っておいたほうと思います。
以上、新世代Javaプログラミングガイドの紹介(Java 11編)でした。