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


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

# Javaは今も無償（その他、JDKとは関係なし）
Javaのサポートとアップデートに関して、Javaチャンピオン数十名が執筆した[Java Is Still Free](https://docs.google.com/document/d/1HtUnuAkUEDGL2gwUOkrDrmLe_zrD6wpAyqYBZxRmHv4/edit)というドキュメントの日本語ドキュメントが公開されました。


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

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

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

```java: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でこれに関する動画が公開されています。

[![](http://img.youtube.com/vi/-k_IicifbxQ/0.jpg)](http://www.youtube.com/watch?v=-k_IicifbxQ)

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

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

[![](http://img.youtube.com/vi/knPSQyUtM4I/0.jpg)](http://www.youtube.com/watch?v=knPSQyUtM4I)


	
## 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です。

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

[![](http://img.youtube.com/vi/BornfFsSlc8/0.jpg)](http://www.youtube.com/watch?v=BornfFsSlc8)

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

[![](http://img.youtube.com/vi/QsKCO9bBB40/0.jpg)](http://www.youtube.com/watch?v=QsKCO9bBB40)