Java11 での変更点


変更点

2018/09/25にJava11がリリースされました。

以下が、Java11でのJEPです。

  • 181: Nest-Based Access Control
  • 309: Dynamic Class-File Constants
  • 315: Improve Aarch64 Intrinsics
  • 318: Epsilon: A No-Op Garbage Collector
  • 320: Remove the Java EE and CORBA Modules
  • 321: HTTP Client (Standard)
  • 323: Local-Variable Syntax for Lambda Parameters
  • 324: Key Agreement with Curve25519 and Curve448
  • 327: Unicode 10
  • 328: Flight Recorder
  • 329: ChaCha20 and Poly1305 Cryptographic Algorithms
  • 330: Launch Single-File Source-Code Programs
  • 331: Low-Overhead Heap Profiling
  • 332: Transport Layer Security (TLS) 1.3
  • 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
  • 335: Deprecate the Nashorn JavaScript Engine
  • 336: Deprecate the Pack200 Tools and API

JDK9からのリリースモデル

JDK9以降から6ヶ月ごと(3月と9月)にフィーチャーリリースを行うというリリースモデルに変更されました。また、脆弱性対応やバグフィックスが、1月、4月、7月、10月の年間計4回でるように固定化されました。バイナリ提供に関して今までは、Oracleから無償でバイナリが提供されていましたが、9以降は無償なバイナリがOpenJDKからの提供に変わります。9以降のOracleJDKは有償になります。また8以前では、OracleJDKとOpenJDKとで技術的な差分がありましたが、これがなくなりました。

LTS

JDK11以降OracleJDKは3年に1度リリースになります。Oracleの有償サポート最低8年でセキュリティアップデートを提供してくれます。また、JDK11以降、開発、テスト、試作、デモの用途に無償で利用可能になります。

Javaは今も無償(その他、JDKとは関係なし)

Javaのサポートとアップデートに関して、Javaチャンピオン数十名が執筆したJava Is Still Freeというドキュメントの日本語ドキュメントが公開されました。

コーディングに影響が大きそうなJEP

JEP181 Nest-Based Access Control

Java10までは、インナークラスからアウタークラスのprivateメソッドを呼び出すコードは変わったバイトコード出力でした。

JDK10で以下のコードを見てみます。

Outer.java
public class Outer {
    private int i = 0;

    public class Inner {
        public int i() {
            return i;
        }
    }
}

コンパイル後、クラスファイルを逆アセンブルしてみます。

$ javap -p -c Outer\$Inner
Compiled from "Outer.java"
public class Outer$Inner {
  final Outer this$0;

  public Outer$Inner(Outer);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #1                  // Field this$0:LOuter;
       5: aload_0
       6: invokespecial #2                  // Method java/lang/Object."<init>":()V
       9: return

  public int i();
    Code:
       0: aload_0
       1: getfield      #1                  // Field this$0:LOuter;
       4: invokestatic  #3                  // Method Outer.access$000:(LOuter;)I
       7: ireturn
}

次に同じコードをJDK11でコンパイルして逆アセンブルしてみます。

$ javap -p -c Outer\$Inner
Compiled from "Outer.java"
public class Outer$Inner {
  final Outer this$0;

  public Outer$Inner(Outer);
    Code:
       0: aload_0
       1: aload_1
       2: putfield      #1                  // Field this$0:LOuter;
       5: aload_0
       6: invokespecial #2                  // Method java/lang/Object."<init>":()V
       9: return

  public int i();
    Code:
       0: aload_0
       1: getfield      #1                  // Field this$0:LOuter;
       4: getfield      #3                  // Field Outer.i:I
       7: ireturn
}

JDK10でコンパイルした方は、InnerクラスはOuterのstaticメソッドaccess$000を呼び出します。JDK11では、Innerクラスはaccess$000メソッドではなくOuterクラスのOuter.iを直接呼び出しています。

JVM Language Summit 2018でこれに関する動画が公開されています。

JEP309 Dynamic Class-File Constants

Javaクラスファイル形式を拡張して、動的な定数をサポートします。Java10までは、プリミティブとリテラルを持つStringだけConstant Poolに格納できましたが、これ以外もConstant Poolで扱えるように。 動的な定数の利点は、言語やコンパイラの自由度が上がる、バイトコード上の定数の自由度が上がるということがあるようです。

JVM Language Summit 2018でこれに関する動画が公開されています。

JEP320 Remove the Java EE and CORBA Modules

JavaEEおよびCORBAモジュールを削除されました。対象は、CORBA、JAXB、JAX-WS、Common Activation Framework、JTA。これらの代行モジュールは以下になります。

  • JAX-WS -> jaxws-api
  • JAXB -> jaxb-api
  • JAF -> javax.activation-api
  • Common Annotations -> javax.annotation-api
  • JTA -> javax.transaction-api

削除理由は、開発速度の違いJavaSEの速度についていけないためのようです。今後はJakartaEEとして開発がされるようです。

JEP321 HTTP Client (Standard)

HTTP Client APIを標準化されました。非同期をサポートし、HTTP/2もサポートしました。モジュール名はjava.net.httpです。

これに関する動画が公開されています。

JEP323 Local-Variable Syntax for Lambda Parameters

Java10で導入されたローカル変数型推論と同じようにラムダパラメータでもvarが使えるようになりました。更にアノテーションがつけられるようになりました。
これに関する動画が公開されています。