Edited at

Java9,10,11の新機能


はじめに

どうも@chan_kakuです!

今回はそろそろサポートが終了するJava8からJava11に移行しようかなーと言う人のためにJava9から11で追加されたAPI、機能について説明させていただきます。


Java9

Java9の新機能についてはこちらを参考にしてください


モジュールシステム

Java9ではProject Jigsawと呼ばれるプロジェクトがありました。

詳細は以下のリンク先にあります

Project Jigsawについて

つまり、以下の4点がこのプロジェクトのゴールでした


Make it easier for developers to construct and maintain libraries

and large applications


ライブラリや大規模アプリケーションのメンテナンスを容易にする


Improve the security and maintainability of Java SE Platform Implementations in general, and the JDK in particular


Java SEプラットフォームのセキュリティと保守性の向上


Enable improved application performance


アプリケーションパフォーマンスの向上


Enable the Java SE Platform, and the JDK, to scale down for use in small computing devices and dense cloud deployments.


Java SEプラットフォームとJDKを低い性能のコンピューティングデバイスや密集したクラウド展開で使用できるように縮小できる

これらを解決するために、Java9ではモジュールシステムが導入されました。

モジュールシステムについてはこの辺りで詳しく説明されています

つまり、別のモジュール(ライブラリ)のpublic,protectedメンバーを使う時、または、別モジュールのためにpublic,protectedメンバーを使わせるときはmodule-info.javaと言うファイルを用意する必要があります。

このモジュールシステムによってモジュールの依存関係や、階層構造を以前に増して理解しやすくなります。


Java10

Java10の新機能はこちらにまとまっています。

個人的に気になった機能をピックアップしていきます


型推論


JEP 286: Local-Variable Type Inference


これはつまりローカル変数の型推論機能です


sample.java

var list = new ArrayList<String>();  // infers ArrayList<String>

var stream = list.stream(); // infers Stream<String>

Javaでは何でもかんでもこのvarを使ってしまうと型がよくわからなくなってしまうので、そこまで頻繁に使うような印象はないですが、上記のように右側に型が明記してある場合には使えるのではないでしょうか?


Java11

例のごとくJava11の新機能はこちらにまとまっています

この中からいくつかピックアップしたいと思います。


ネストクラスのアクセス制限


JEP 181: Nest-Based Access Control


ここではネストメイトのプライベートアクセスをJVMのアクセスルールとして制限すると記述されています。

ちなみにここで出てきたネストメイトとは以下のように定義されています


A field or method R is accessible to a class or interface D if and only if any

of thefollowing conditions are true:

・R is private and is declared in a different class or interface C, and C and D, are nestmates.


これは使う側としては変わりはないのですが、バイトコードにすると今までよくわからないようなメソッドを読んでいたものちゃんと意図したものにようやくなった

というような感じです


HTTPクライアント


JEP 321: HTTP Client (Standard)


こちらはModanAPiやHTTP2,WebSocket,Reactiveに対応したと言うものです


型推論


JEP 323: Local-Variable Syntax for Lambda Parameters


こちらはJava10の説明でもあった型推論がラムダ式のパラメータとしても使えるようになったと言うものです。


最後に

Java9~11で様々なfeatureが追加されましたが、個人的にはここで紹介したあたりを押さえておけばひとまずは大丈夫かなという印象です。

他にもこのfeatureは知っておかないとなどあればコメントいただけると助かります!