要約Java8→17 。何が変わったのか?

  • このエントリーをはてなブックマークに追加

Java17が2021/9/14にリリースされました。
Java17は長期サポートされる(LTS)バージョンです。
特にJavaに携わっているエンジニアが大半というボンズテックでは注視していることでもあります。
エンタープライズとして今後もJavaを使っていけるかの試金石になるバージョンなのではないかと感じています。
実際にJava17になって何が変わったのかを要約解説いたします。

1.何でJava8→Java17なのか?

Oracle JDK 17より再び無償利用可能。この1点に尽きます。

ご存じの方も多いと思いますが、OracleはJava11から商用利用を有償化したため、LTS(Long Term Support、長期サポート)版としてはJava8が最終版となっていました。
ところが一転、先日リリースされた「Oracle JDK 17」では再び無償化となりました。

理由は推測するしかありませんが、こちらの記事にもあるようにOracleの影響力低下やJava言語自体の人気低下を危惧したのではないでしょうか。

また、現状のJava利用状況としてOpenJDK系(AdoptOpenJDK、Amazon Corretto等)へと移行済みのシステムがある一方で、まだJava8を利用している所も多いと思われます。
このため、この記事がJava8→Java17というケースに関わる方の参考になれば幸いです。

2. Java17はいつまで使えるの?

2023年9月までは無償利用可能です。
なお、リリース案内の記載通り、次のLTSリリース次第で変更される可能性があります。

・次のLTSのリリースから1年後まで、無償で使用できるライセンスの下で提供されます。
・次のLTSのリリースをJava 21とし、2023年9月の提供開始を検討しています。

3. Java8→Java17の変更内容一覧

Java8以降の更新内容はJEP(JDK Enhancement Proposal)として、こちらにまとめられています。
ただ、Incubatorやpreview等の正式採用前の機能も含まれており、そのままでは分かり辛いです。
このため、下記の条件で抽出し要約を加えたものをこちらにまとめてみました。

・TypeがF(Feature)のもの
・P(Process)、I(Informational)、S(Infrastructure)は除外
・Releaseが9~17のもの
・正式採用前の機能およびJVM高速化関連は除外
・正式採用前:Titile内にPreview、Incubator、Phase *が含まれているもの
・JVM関連:分類がhotspot、Titile内にJVMが含まれているもの

4. Java8→Java17の気になる新機能

一覧の中から重要度が高いものや気になった点について紹介します。
※バージョン表記は正式採用となったものを記載しています。

4-1. モジュールシステム:JAR地獄にさようなら

Java9より、複数のパッケージをまとめて管理する「モジュール」が導入されました。
※開発名「Project Jigsaw」として完成まで9年、前身のJSR277(Java仕様要求)からでは10年以上の歳月を費やしています。

従来のパッケージ管理には以下の問題がありました。

・依存関係が定義できない
使用する別々のjarが同じライブラリの別バージョンを要求した場合、どちらが使用されるか不明。予期しない結果を引き起こす事も。 → 所謂JAR地獄

・公開範囲の定義ができない
ライブラリ内の内部用クラス等で隠蔽したい場合でも、構成上publicにせざるを得ず リフレクションを用いて利用されてしまう。

モジュール導入により、これらの依存関係・公開範囲の定義を指定できるようになりました。
方法としてはsrcフォルダのトップにmodule-info.javaを配置して必要な情報を記述します。

// 公開モジュールhoge
module hoge {
    // requires <module>:依存関係の定義
    // java.langやjava.io等、Java基礎パッケージのjava.baseモジュールはのみ宣言不要
    requires fuga;

    // exports <package>:パッケージの公開定義
    exports org.exsample.hoge;
}
// 公開モジュールfuga
module fuga {
    // requires transitive <module>:推移的依存関係の定義
    // この指定で利用先(今回ならhoge)もjava.sqlが利用可能となる
    requires transitive java.sql;

    // transitiveを付与しない場合は依存先からの利用は不可
    requires java.net.http;

    // export <package> to <module>:パッケージの公開先モジュールを限定
    exports org.exsample.fuga to hoge;    
}

この他、opens(指定パッケージのprivateメンバへのリフレクション参照許可)等の指定や
無名モジュール(クラスパスから参照されたパッケージやクラス)、
自動モジュール(モジュール化対応していないライブラリをモジュールパスに入れた場合)
といった概念などについてはこちらが参考になります。

4-2. jshell:他言語で主流のREPL、手軽に実行確認

同じくJava9より、REPL(Read-Evaluate-Print Loop:対話型評価環境)としてjshellが追加されました。
他言語でもおなじみのターミナル上でプログラムを1行ずつ記入・実行・表示できる機能です。
起動はコマンドラインから「jshell」と打つだけなので、ちょっとした動作確認に重宝しそうですね。
例えばDateTimeFormatterの指定では、wとWでどちらが年内の週数?と迷った場合

jshell> import java.time.*
jshell> import java.time.format.DateTimeFormatter
jshell> LocalDate.of(2021,10,30).format(DateTimeFormatter.ofPattern("W"));
$3 ==> "5"
jshell> LocalDate.of(2021,10,30).format(DateTimeFormatter.ofPattern("w"));
$4 ==> "44"

などと実際に叩いてみれば一目瞭然ですね。
細かい使用方法は、ユーザーガイド(Java16版:日本語Java17版:英語)やこちら が参考になります。

コーディングに関する変更点とは

4-3. コーディングに関する変更点

細かなものが多いですが、コーディングがより快適になる便利な機能が色々と追加されています。

1. ローカル変数の型推論:varによる型記述の省略(Java10)

ローカル変数が「var 変数名 = 初期値」と型名を書かずに定義できるようになりました。

// 従来の定義
String str = "hoge";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss");

// varを利用した定義
var str = "hoge";
var dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss");

型名が長いものなどはスッキリ書けてコードが読みやすくなりますね。
ただ、これはオブジェクト型・プリミティブ型が何で入る万能型が追加されたのではなく、あくまで右辺(初期値)から型を判断してくれるという機能です。
このため、下記のような初期値が無い変数には使用できません。
また、一見して型を推測できない場合には逆に可読性を下げる事にもなるため、むやみやたらと使用するのではなく、チーム内で使用方針を決めておきたいですね。

var obj = null;    // エラー、nullからでは型を推測する事ができない
var time = new Date().getTime()    // long型として使用可能だが、

使用時の注意点などはこちらが参考になります。

2. ラムダ式引数へのvar使用:ラムダ式の引数にアノテーションが利用可能に(Java11)

上記のvarですが、ラムダ式の引数にも使用できます。
元々、ラムダ式の引数にはvarの記述は不要なのですが、varを入れる事でアノテーションを付与できるようになり、その恩恵を受けられます。

(x, y) -> x.process(y);
(@Nonnull x, @Nullable y) -> x.process(y);    // これは出来ない

// var記述によりアノテーション付与が可能に
(@Nonnull var x, @Nullable var y) -> x.process(y);

3. switch式:分岐結果が値としても利用可能に(Java14)

switchが文だけでなく式として追加され、値を返す事が出来るようになりました。
また、従来の「case L:」に加えて「case L ->」とするアロー構文も追加され、より直感的かつ簡素に記述する事が出来るようになりました。
構文はこちらが参考になりますが、下記サンプルだけでも想像できるのではないでしょうか。

import java.time.LocalDate;
import java.time.DayOfWeek;
var day = LocalDate.now().getDayOfWeek();
var value = switch (day) {
    case MONDAY, TUESDAY, WEDNESDAY -> 1;
    case THURSDAY, FRIDAY-> 2;

    // ブロックでの複数処理は{}、値の返却にはyieldを使用
    default -> { System.out.println("土日専用メッセージ"); yield 3; }
};
System.out.println(value);

なお、switch式では網羅性チェックも追加されています。
このため、int等のプリミティブ型でdefaultが無い場合や列挙型でdefault無し+列挙子の定義漏れがある場合にはコンパイルエラーとなります。

4. 複数行文字列リテラル:改行付き文字列を「見た目通り」に定義(Java15)

タイトル通り、複数行の文字列を素直に定義できるようになりました。
従来は下記のように文字列を連結したり、StringBuilder.appendを利用するなどお世辞にも可読性が高いとは言えないものでした。

String html = "<HTML>" +
    "\n\t" + "<BODY>" +
    "\n\t\t" + "<H1>\"Java 13 is here!\"</H1>" +
    "\n\t" + "</BODY>" +
    "\n" + "</HTML>";

StringBuilder sb = new StringBuilder();
sb.append("<HTML>\n");
sb.append("\t<BODY>\n");
sb.append("\t\t<H1>\"Java 13 is here!\"</H1>\n");
sb.append("\t</BODY>\n");
sb.append("</HTML>");
String html_sb = sb.toString();

これが下記のように定義できるようになり、より直感より可読性の高いコードを書けそうです。

String html_new = """
    <HTML>
        <BODY>
            <H1>"Java 13 is here!"</H1>
        </BODY>
    </HTML>""";

詳細についてはOracleの紹介ページこちらが参考になります。

5. instanceofのパターンマッチング:型チェック+変数定義を簡素に記述(Java16)

従来、オブジェクト型検証+キャストの2段階記述が必要な箇所が1度で済むようになりました。

// 従来の書き方
if (obj instanceof String) {
    String s = (String) obj;
    ・・・  // sを利用した処理
}

// 新しい書き方
if (obj instanceof String s) {
    ・・・  // sを利用した処理
}

これだけでも十分ですが、パターンマッチングで定義された変数のスコープは
通常のローカル変数と異なり、フロー解析に基づいて決められる「流動的スコープ」として、下記のようにパターンと一致しているのが自明な範囲がスコープとなります。

public void onlyForStrings(Object o) throws MyException {
    if (!(o instanceof String s)){
        // sは使用不可(スコープ外)
        throw new MyException();
    }
        // sが使用可能(スコープ内)
        System.out.println(s);
    }
}

これを上手く活用する事で、よりコンパクトな記述が可能です。
公式での例としては、Pointクラスのequalsメソッドが例として挙げられています。

// 従来の書き方
public boolean equals(Object o) {
    if (!(o instanceof Point)){
        return false;
        Point other = (Point) o;
        return x == other.x && y == other.y;
    }
}
   
// 新しい書き方
public boolean equals(Object o) {
    return (o instanceof Point other) && x == other.x && y == other.y;
}

6. record:値を保持するだけのクラスを手軽に定義(Java16)

データ格納先として値を保持するだけのimmutable(不変)なクラスを定義する機能です。
従来は単に値を保持するクラスを作成するためだけに、コンストラクタやgetterメソッド、toString()、equals()、hashCode()など大量の記述が必要でしたが、そこからようやく解放されます。
例えば座標x,yを保持するクラスなら下記の記述だけで済んでしまいます。

record Point(int x, int y) { }

これと同等のクラスを義するには下記となり、その差は歴然です。

class Point {
   private final int x;
   private final int y;
   
   Point(int x, int y) {
       this.x = x;
       this.y = y;
   }
   
   int x() { return x; }
   int y() { return y; }
   
   public boolean equals(Object o) {
       if (!(o instanceof Point)) return false;
       Point other = (Point) o;
       return other.x == x && other.y == y;
   }
   
   public int hashCode() {
       return Objects.hash(x, y);
   }
   
   public String toString() {
       return String.format("Point[x=%d, y=%d]", x, y);
   }
}

上記通り、getterについてはget*()などではなくフィールドと同名のメソッドとなります。
また、immutableなクラスであるためsetterは作成できません。
※メソッドは自由に追加できますが、フィールドの変更はできません。
構文の詳細についてはこちらが参考になります。

7. Sealed:継承先を限定できるように(Java17)

classやinterface定義において継承先を限定できる機能が追加されました。
使い方は、下記のような形でsealedおよびpermitsで指定します。
※sealed(封印)であり、shield(盾)ではない事に注意してください。

// Shapeクラスの継承先をCircle、Rectangleに限定
public abstract sealed class Shape permits Circle, Rectangle { ... }

継承先を限定するメリットは、5で説明したようなパターンマッチングとの組み合わせで発揮されます。
enumと同様に宣言されたの以外の考慮が不要となり、記述をより簡素化できます。

Shape shape = new Circle(10);
if (shape instanceof Circle c) {
    // 処理
} else if (shape instanceof Rectangle r) {
    // 処理
    // } else {
    // ShapeのサブクラスはCircleとRectangleのみと保証されているため
    // ここのelseは不要に
}

なお、上記と同様にswitch式でのdefaultも省略できるように思えますが、こちらはJava17ではpreview、Java18でもsecond previewとまだ先のようです。

5. 番外:JREは今どこに?

今回の記事作成中にふと「そういえばJREはどうなったのだろうか?」と思いました。
※従来はJDKを利用して実行可能なjarを開発し、実行環境でインストール済みのJREを利用して実行するという前提でした。

結論としては現在ではインストール用のJRE提供は無くなり、実行可能jarの中にJREを含めて配布する方式となったようです。

こちらの「軽量化したJREをバンドルする配布方式の提案」に記載されている通り、従来はサイズの問題で実行可能jar内にJREを含めるのが難しかったものの、
モジュールシステム導入で解決(JREの必要分のみjarに含める)したようです。

Java8→Java17変更内容一覧

release JEP Title(原文) 概要
9 102 Process API Updates プロセスAPI改善
java.langにProcessHandle、ProcessHandle.Infoを追加
9 193 Variable Handles 変数ハンドル
java.lang.invokeにVarHandleを追加(MethodHandleの変数版)
※java.util.concurrent.atomicとsun.misc.Unsafeの代替機能
9 200 The Modular JDK モジュール関連  ※本文で別途解説
9 201 Modular Source Code モジュール関連  ※本文で別途解説
9 211 Elide Deprecation Warnings on Import Statements 非推奨の型を含んだソースをimportした際の警告を削除
9 212 Resolve Lint and Doclint Warnings 基本パッケージのコンパイル時警告の修正
※javacの-Xlint、-Xdoclint指定時の警告抑制
9 213 Milling Project Coin Project Coin(Java7の言語仕様変更)の細かな残対応
9 215 Tiered Attribution for javac javacの内部動作改修
9 216 Process Import Statements Correctly javacの内部動作改修
9 217 Annotations Pipeline 2.0 javacの内部動作改修
9 219 Datagram Transport Layer Security (DTLS) DTLSプロトコルのバージョン1.0、1.2をサポート
9 220 Modular Run-Time Images モジュール関連  ※本文で別途解説
9 221 New Doclet API Doclet API(JavaDoc作成に利用されるAPI)の置き換え
9 222 jshell: The Java Shell (Read-Eval-Print Loop) jshellの追加  ※本文で別途解説
9 223 New Version-String Scheme Javaのバージョン番号の命名規則変更
「$MAJOR.$MINOR.$SECURITY」形式に
※Java9なら9.0.1など(Java10のJEP322で再変更あり)
9 224 HTML5 Javadoc javadocでHTML5の出力が可能に
9 225 Javadoc Search javadocの生成物にブラウザ内検索機能を追加
9 226 UTF-8 Property Resource Bundles プロパティファイルのUTF-8対応
9 227 Unicode 7.0 Unicode 7.0の追加文字対応
9 229 Create PKCS12 Keystores by Default Keystoreのデフォルト方式をJKS→PKCS12に変更
9 231 Remove Launch-Time JRE Version Selection 実行時のJREバージョン指定機能の削除
9 232 Improve Secure Application Performance Java8で追加されたSecurityManagerの性能改善
※Java17では使用非推奨
9 235 Test Class-File Attributes Generated by javac javacが生成するクラスファイルのファイル属性のテストについて
9 238 Multi-Release JAR Files マルチリリースjarの追加
※JARファイル内に複数javaバージョンのクラスファイルを格納
9 241 Remove the jhat Tool jhatツールの削除
※ヒープ解析ツール
9 244 TLS Application-Layer Protocol Negotiation Extension javax.net.sslパッケージでのALPN(※)対応
※TLS拡張の一部で本通信前の事前接続に関する規定
9 246 Leverage CPU Instructions for GHASH and RSA GHASHおよびRSA暗号化操作のパフォーマンス向上
※SPARCおよびIntelx64 CPU命令の活用
9 247 Compile for Older Platform Versions javacでの旧バージョン指定オプション(–release)の追加
※-source、-target、-bootclasspathの統合
9 249 OCSP Stapling for TLS javax.net.sslパッケージでのOCSP(※)対応
※オンラインで証明書の状態を検証するプロトコル
9 251 Multi-Resolution Images マルチ解像度を扱うinterfaceの追加
java.awt.image.MultiResolutionImage
9 252 Use CLDR Locale Data by Default ロケールのデフォルトをCLDRに変更
※ロケール:日付フォーマットや通貨名、曜日の並びなど
※CLDR:UnicodeConsortiumのCommon Locale Data Repository
9 253 Prepare JavaFX UI Controls & CSS APIs for Modularization JavaFXのモジュール化
※Java11からJDKには含まれず、OpenJFXとして単体配布に
9 254 Compact Strings Stringクラスの内部保持方法変更
※従来のUTF-16エンコード+char配列(1文字2byte固定)から、
 byte配列+内容に応じたLATIN1(1文字1byte)への変更
9 255 Merge Selected Xerces 2.11.0 Updates into JAXP JAXP APIのApache Xercesパーサ2.11.0のサポート
※JAXP:Java API for XML Processing
9 256 BeanInfo Annotations @beaninfo Javadocタグを下記注釈型に置き換え
JavaBean、BeanProperty、SwingContainer
9 257 Update JavaFX/Media to Newer Version of GStreamer マルチメディアフレームワークGstreamerのバージョン更新
※JavaFXの内部で利用されているフレームワーク
9 258 HarfBuzz Font-Layout Engine OpenTypeフォントアウトエンジンをICUからHarfBuzzに置き換え
※アラビア語やインド語などのレンダリングに使用される
9 259 Stack-Walking API スタック・トレース内の情報フィルタリングや
遅延アクセスが可能となるjava.lang.Stackwalkerの追加
9 260 Encapsulate Most Internal APIs モジュール化機能関連  ※本文で別途解説
9 261 Module System モジュール化機能関連  ※本文で別途解説
9 262 TIFF Image I/O TIFF形式の画像入出力に標準対応
javax.imageio.plugins.tiffを追加
9 263 HiDPI Graphics on Windows and Linux Windows/LinuxのHiDPI(高解像度)ディスプレイでの
AWT/Swingコンポーネントの自動サイズ設定対応
※Mac OS Xは対応済み
9 264 Platform Logging API and Service 新しいLoggingAPIの追加
java.langにSystem.Logger、System.LoggerFinderを追加
9 265 Marlin Graphics Renderer java2Dのラスタライザー(※)をMarlinRendererに変更
※ベクトル画像→ビットマップ画像の変換モジュール
9 266 More Concurrency Updates java8で導入されたCompletableFutureの機能拡張
9 267 Unicode 8.0 Unicode 8.0の追加文字対応
9 268 XML Catalogs OASIS XML Catalogs standard, v1.1をサポートする
XMLカタログAPI(javax.xml.catalog)の追加
9 269 Convenience Factory Methods for Collections ListやMap等の静的な簡易生成メソッドの追加
Map.of()、Map.ofEntries()など
9 272 Platform-Specific Desktop Features java.awt.Desktopクラスへの機能追加
Platform固有機能(タスクバーなど)がアクセス可能に
9 273 DRBG-Based SecureRandom Implementations java.security.SecureRandom(セキュリティ用乱数生成)で
使用可能なアルゴリズムにDRBGを追加
9 274 Enhanced Method Handles java.lang.invokeのMethodHandle等の改善
9 275 Modular Java Application Packaging モジュール関連  ※本文で別途解説
9 276 Dynamic Linking of Language-Defined Object Models 動的リンカAPIのjdk.dynalink追加
9 277 Enhanced Deprecation 非推奨を示す@Deprecatedの属性追加
since(非推奨となった時期)、
forRemoval(APIが今後のリリースで削除されるかどうか)
9 279 Improve Test-Failure Troubleshooting JDKのテストフレームワークjtregでのテスト失敗や
タイムアウト発生時に診断情報の自動収集
9 280 Indify String Concatenation +演算による文字列連結処理の改善
※StringBuilderが使われなくなった
9 282 jlink: The Java Linker モジュール関連  ※本文で別途解説
9 283 Enable GTK 3 on Linux Linux上のJavaグラフィカルアプリケーションでのGTK3対応
9 285 Spin-Wait Hints 他処理待ちのループ中を示してパフォーマンスを向上させる
java.lang.Thread.onSpinWait()の追加
9 287 SHA-3 Hash Algorithms java.security.MessageDigest(ハッシュ化)で
使用可能なアルゴリズムにSHA-3を追加
9 288 Disable SHA-1 Certificates JDKのセキュリティ構成改善
jdk.certpath.disabledAlgorithmsのプロパティの機能拡張
9 289 Deprecate the Applet API Javaアプレットの非推奨化
9 290 Filter Incoming Serialization Data 直列化データ復元前の検証用機能の追加
java.ioのObjectInputStreamに対してのObjectInputFilter追加
※java6,,7,8へもバックポートされている
9 298 Remove Demos and Samples 古くてメンテナンスされていないデモとサンプルの削除
10 286 Local-Variable Type Inference ローカル変数の型推論  ※本文で別途解説
10 313 Remove the Native-Header Generation Tool (javah) javahの削除(javac -hに置き換え)
※JavaクラスからCのヘッダーやソースファイルを生成するツール
10 314 Additional Unicode Language-Tag Extensions java.util.Locale関連のAPI拡張。
BCP 47(言語タグの構文仕様)の追加Unicode拡張への対応
10 319 Root Certificates JDKでルート証明機関証明書のデフォルトセットを提供
10 322 Time-Based Release Versioning JEP223 Javaのバージョン番号の命名規則変更
「$FEATURE.$INTERIM.$UPDATE.$PATCH」形式に
※Java10なら10.0.1.2など
11 320 Remove the Java EE and CORBA Modules JavaEEおよびCORBAモジュールの削除
11 321 HTTP Client HTTPクライアントAPI(java.net.http)の追加
HTTP/2やWebSocketのサポートなど
11 323 Local-Variable Syntax for Lambda Parameters ラムダ式引数へのvar使用  ※本文で別途解説
11 324 Key Agreement with Curve25519 and Curve448 暗号化署名APIでのCurve25519、Curve448をサポート
11 327 Unicode 10 Unicode 10.0の追加文字対応
11 329 ChaCha20 and Poly1305 Cryptographic Algorithms 暗号化署名APIでのChaCha20、ChaCha20-Poly1305をサポート
11 330 Launch Single-File Source-Code Programs シングルJavaファイルからの即時Java実行
11 332 Transport Layer Security (TLS) 1.3 TLSプロトコルのバージョン1.3をサポート
11 336 Deprecate the Pack200 Tools and API Pack200ツール(※)の非推奨化
※JARファイルをネットワーク上で効率良く転送できる
 Pack200形式に変換するためのJavaアプリケーション
12 230 Microbenchmark Suite JDKにJMH(Java Microbenchmark Harness)を追加
※マイクロベンチマーク
 (メソッド等の細かな単位での信頼性・性能評価)
13 353 Reimplement the Legacy Socket API TCPソケット関連APIの実装変更
※ java.net.Socket、java.net.Server.Socket
14 352 Non-Volatile Mapped Byte Buffers java.nio.MappedByteBufferの不揮発メモリ向け改良
※FileChannelから上記インスタンス取得時のモード指定追加
14 361 Switch Expressions switch式  ※本文で別途解説
14 362 Deprecate the Solaris and SPARC Ports Solaris/SPARC、Solaris/x64、Linux/SPARCのサポート終了
※この段階では削除予告。Java15のJEP381にて終了
14 367 Remove the Pack200 Tools and API JEP336で非推奨となっていたPack200ツールの削除
15 339 Edwards-Curve Digital Signature Algorithm (EdDSA) 暗号化署名APIでのEdDSAをサポート
15 371 Hidden Classes フレームワーク等が動的に作成したクラスが隠蔽されるように
特定の方法以外でアクセス出来ないようにする機能の追加
※Java言語としてではなくJVMの機能
15 373 Reimplement the Legacy DatagramSocket API UDPソケット関連APIの実装変更
※ java.net.DatagramSocket、java.net.Server.MulticastSocket
15 378 Text Blocks 複数行文字列リテラル  ※本文で別途解説
15 385 Deprecate RMI Activation for Removal java.rmi.activation(※)の非推奨化
(Java17のJEP407で削除)
※rmidというデーモンにRMIサービスを登録して、
 必要に応じてリモートオブジェクトを起動する機能
16 380 Unix-Domain Socket Channels java.nio.channelsのUNIXドメインソケット対応
※SocketChannel、ServerSocketChannel
16 390 Warnings for Value-Based Classes OptionalやIntegerクラスなど値ベースクラスについての
コンストラクタを廃止予定にして、使用時に警告を表示
16 392 Packaging Tool jpackage(※)の追加
※配布用パッケージ(インストーラー)作成用ツール
16 394 Pattern Matching for instanceof instanceofのパターンマッチング  ※本文で別途解説
16 395 Records recordの導入  ※本文で別途解説
16 396 Strongly Encapsulate JDK Internals by Default JDKの内部APIを隠蔽状態に変更
※sun.misc.Unsafe等の一部主要APIを除く
17 306 Restore Always-Strict Floating-Point Semantics 浮動小数点数を厳密に処理するstrictfp修飾子の常時利用
17 356 Enhanced Pseudo-Random Number Generators 疑似乱数生成機能の拡張
※java.util.randomの追加
17 382 New macOS Rendering Pipeline macOSでのJava2DのレンダリングにApple Metalを使用
17 398 Deprecate the Applet API for Removal Javaアプレットが削除予定に
17 403 Strongly Encapsulate JDK Internals JDKの内部APIを隠蔽状態に変更
※sun.misc.Unsafe等の一部主要APIを除く
※Java16のJEP396と異なり、コマンドラインオプションでの
 全体緩和が不可能に。(個別指定での使用は可能)
17 407 Remove RMI Activation JEP385で非推奨となっていたjava.rmi.activationの削除
17 409 Sealed Classes Sealedの導入  ※本文で別途解説
17 411 Deprecate the Security Manager for Removal Java8で追加されたSecurityManagerの非推奨変更
17 415 Context-Specific Deserialization Filters JEP290の直列化データの受信のフィルタリング
  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。