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で以下のコードを見てみます。
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が使えるようになりました。更にアノテーションがつけられるようになりました。
これに関する動画が公開されています。
Author And Source
この問題について(Java11 での変更点), 我々は、より多くの情報をここで見つけました https://qiita.com/zgmf_mbfp03/items/5c6e9a0a409fc28f4c59著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .