Java17が2021/9/14にリリースされました。
Java17は長期サポートされる(LTS)バージョンです。
特にJavaに携わっているエンジニアが大半というボンズテックでは注視していることでもあります。
エンタープライズとして今後もJavaを使っていけるかの試金石になるバージョンなのではないかと感じています。
実際にJava17になって何が変わったのかを要約解説いたします。
Contents
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の変更内容一覧
・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の直列化データの受信のフィルタリング |