Java11の勉強

はじめに

Java8環境での開発をしばらくやっていてすっかりJavaのアップデートについていけていないので Java8環境からJava11環境での差分を勉強してみます。

検証環境

下環境で実施しています。

端末

Java version

java -version
java version "11.0.7" 2020-04-14 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.7+8-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.7+8-LTS, mixed mode)

本記事で検証すること

主にJava8からJava11の間に追加されたものについて触ってみるという目的で実施しました。 今回は言語についての変更点についてとし、以下について触ってみたことについて書いていきます。

  • var
  • try-with-resourceの変更
  • 匿名クラスのダイアモンド演算子を省略できる
  • 変数の_が使えない

var

ローカル変数に型推論が使えるようになりました。 具体的には以下のように書けるようになっています。

Java11前

String beforeDeclaration = "宣言時に型を指定";

Java11

var afterDeclaration = "varで宣言できる";

宣言はできるが、method引数にはできない模様。 試しに以下のように実装しましたがコンパイルエラーになりました。

private static void sampleArgVar(var a) {
        
    }

varまとめ

宣言時はvarでできるようになったので簡潔に書けるようになりました。 一方でソースを読むときに何の型がわからないケースがでてきそうなので 乱用すると保守が難しくなりそう。。。

以下の記事に指標についてまとめられているので参考になります。

qiita.com

try-with-resourceの変更

リソースのclose方法の進化を見ていきます。 ここでは、Java1.7より前の方法から。

java1.7より前

        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(path)));
            System.out.println(br.readLine());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            br.close();
        }

java1.7

        BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(path)));
        try (BufferedReader brTmp = br) {
            System.out.println(brTmp.readLine());
        }

java1.9で変更

Java1.9の変更点は一時変数に入れた場合に、別変数に入れる必要があったところが その必要がなくなった部分になります。

        BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(path)));
        try (br) {
            System.out.println(br.readLine());
        }

まとめ

リソースのclose方法はかなり簡潔に書けるようになっている。

匿名クラスのダイアモンド演算子を省略できる

こちらもJava1.9から。 匿名クラスにダイアモンド演算子での定義ができるようになったようだ。

        List<String> anonymousDeclarationTests = new ArrayList<>() {{
            this.add("aaa");
            this.add("bbb");
        }};

まとめ

変更点について見ていきました。 varについてはなんとなく知っていたのですが、他の変更点も確認でき良かったかと思います。 次はJavaの標準ライブラリについての変更点について見ていければと思います。