いよいよJava SE 9のリリースが迫ってきました。予定通りであれば、2017年の7月にはJava SE 9がリリースされます。今回からはJava SE 9の言語仕様の変更や、コアライブラリの新機能について紹介していきます。今回は言語仕様の変更について紹介します。

Milling Project Coin

 Java SE 7で言語仕様に小さな変更があったことを覚えておいででしょうか。この仕様変更はProject Coinと呼ばれていましたが、まだやり残したことがあったのです。その積み残しが「JEP213 Milling Project Coin」です。

 JEPはJDK Enhancement Proposalsのことで、OpenJDKにおけるJava SEの機能拡張提案を示します。Javaの標準を策定するJCPにおける提案(JSR)とは異なり、小さい機能拡張なども含まれています。例えば、Project Jigsawは5つのJEPからなっており、それらをまとめてJSR 376 Java Platform Module Systemとして仕様策定されています。

 Milling Project Coinとなっているのは、前述したようにJava SE 7の残件がメインとなっているからのようです。またMillingというのはコーヒーミルのミルと同じ意味で、一般的には砕いて小さくすることを意味します。コインの場合、コインの外周にギザギザを付ける意味になります。Milling Project Coinはギザギザによって新たな価値を付けるという意味合いのようです。

 Milling Project Coinでは以下の5種類の言語仕様の変更が提案されています。

  • privateインスタンスメソッドでの@SafeVarargs
  • try-with-resources構文の変更
  • 匿名クラスでのダイヤモンド演算子
  • 識別子としてのアンダースコアの禁止
  • インタフェースにおけるprivateメソッド

privateインスタンスメソッドでの@SafeVarargs

 「@SafeVarargs」アノテーションは、可変長引数のメソッドを修飾するアノテーションです。可変長引数はメソッド本体では配列として扱われます。このため、可変長引数にジェネリクスの型パラメータをとるメソッドでは、使い方によっては型パラメータで指定した型の配列に対する無検査作成になり、コンパイル時に警告されます。この問題を防ぐため、メソッドが安全であることを示す@SafeVarargsアノテーションが使用されます。

 例えば、標準ライブラリであれば、以下のメソッドなどが@SafeVarargsアノテーションで修飾されています。

  • Arrays.asList(T... a)
  • Collections.addAll(Collection<? super T> c, T... elements)
  • EnumSet.of(E first, E... rest)
  • Stream.of(T... values)

 もちろん、自作のメソッドでも@SafeVarargsアノテーションを使用できます。しかし、どのメソッドでも@SafeVarargsアノテーションを使用できるわけではありません。@SafeVarargsアノテーションを使用できるのは、以下のメソッドです。

  • finalメソッド
  • staticメソッド
  • コンストラクタ

 これらのメソッドは、安全であることを保証するために、いずれもオーバーライドできないという特徴を持ちます。これに加え、Java SE 9からは、privateメソッドでも@SafeVarargsメソッドが使用できるようになりました。上記のメソッドに加えて、

  • privateなインスタンスメソッド

が使えるようになります。もちろんprivateメソッドですから、オーバーライドすることはできません。

 今までは、privateメソッドに対する警告は、そのメソッドをコールする側で@SuppressWarnings("unchecked")アノテーションを使用しなくてはいけませんでした。Java SE 9からは、それが不必要になるわけです。

try-with-resources構文の変更

 ファイルの入出力やソケットなど、使用し終ったらクローズしなくてはいけない処理は、多くあります。これに対し「try-with-resources」構文を使用すると、明示的にクローズを行わなくても、使用後にクローズしてくれます。ただしtry-with-resources構文でリソースを使用するには、リソースがAutoCloseableインタフェースを実装する必要があります。また、AutoCloseableオブジェクトの変数はtry文で定義する必要があります。前者はしかたないとして、後者は少々使いづらい点となっていました。