記事のディレクトリ
序文
2021年3月16日、Java16が正式にリリースされました。Java16をダウンロードして使用できます。
特性
ベクターAPI(インキュベーション)
実行時に、Vectorは、同等のスカラー計算よりも優れたパフォーマンスを実現するために、CPUアーキテクチャで最高のベクトルハードウェア命令をサポートするようにベクトル計算を確実にコンパイルできることを意味します。CPUベクトル計算におけるJavaのパフォーマンスが向上しました。
C ++ 14言語機能を有効にする
JDKのC ++ソースコードでC ++ 14の新機能を使用できるようにし、ホットコードで使用できる機能に関する具体的なガイダンスを提供します。
MercurialからGitへの移行
OpenJDKコミュニティのソースコードリポジトリをMercurial(hg)からGitに移行します。
GitHubに移行する
GitHubでOpenJDKコミュニティのGitリポジトリをホストします。JEP 357(MercurialからGitへの移行)とともに、これにより、リポジトリ内のすべてのOpenJDKプロジェクトがGitHubに移行されます。これには、JDK機能のバージョンとバージョン11以降のJDKの更新が含まれます。
ZGC並行スレッドスタック処理
ZGCスレッドスタック処理をセーフポイントから並行フェーズに移動します。
Unixドメインソケットチャネル
java.nio.channelsパッケージで、ソケットチャネルおよびサーバーソケットチャネルAPIのUnixドメイン(AF_UNIX)ソケットサポートを追加します。
アルパインLinuxポート
x64およびAArch64アーキテクチャでは、JDKをAlpineLinuxおよびメインCライブラリとしてmuslを使用する他のLinuxディストリビューションに移植します。
弾性メタスペース
未使用のホットスポットメタデータ(つまり、メタスペースメタスペース)メモリをタイムリーにオペレーティングシステムに返して、メタスペースの占有を減らし、メタスペースコードを簡素化して、メンテナンスコストを削減します。
Windows / AArch64ポート
JDKをWindows / AArch64に移植します。新しいコンシューマーグレードおよびサーバーグレードのAArch64(ARM64)ハードウェアのリリースにより、Windows / AArch64はエンドユーザーのニーズにとって重要なプラットフォームになりました。
フォーリンリンカーAPI(インキュベーション)
静的に型付けされた純粋なJavaアクセスをネイティブコードに提供するAPIを導入します。このAPIは、外部メモリAPI(JEP 393)とともに、ネイティブライブラリにバインドするエラーが発生しやすいプロセスを大幅に簡素化できます。
値ベースのクラスに関する警告
元のラッパークラスを値ベースのクラスとして指定し、それらのコンストラクターを削除するために非推奨にし、新しい非推奨の警告を促します。Javaプラットフォームの値ベースのクラスのインスタンスでの同期に関する警告を提供します。
包装ツール
自己完結型のJavaアプリケーションをパッケージ化するためのjpackageツールを提供します。
外部メモリアクセスAPI(3回目のインキュベーション)
JavaプログラムがJavaヒープの外部の外部メモリに安全かつ効果的にアクセスできるようにするAPIを導入します。
instanceofのパターンマッチング
instanceof演算子でパターンマッチングを使用して、Javaプログラミング言語を拡張します。パターンマッチングにより、プログラムの一般的なロジックが可能になります。つまり、オブジェクトからコンポーネントを条件付きで抽出し、より簡潔で安全な方法で表現できます。
以前は、このように使用し、最初にタイプを判別してから、強制的に変換していました。
if (obj instanceof String) {
String s = (String) obj;
...
}
Java 16では、変数sを直接使用できます。
if (obj instanceof String s) {
// 可以直接使用s
...
}
このように使用することもできますが、最初の判断が確立され、2番目の判断が正しく実行されることが前提であるため、||の代わりに&&を使用できます。
if (obj instanceof String s && s.length() > 5) {
flag = s.contains("jdk");
}
記録
Recordsキーワードを使用してJavaプログラミング言語を拡張し、Recordsを不変データの透過的なキャリアのクラスとして使用します。
以前は、次のようにクラスを定義しました。
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);
}
}
Java 16では、次の定義のみが簡潔に必要です。
record Point(int x, int y) {
}
デフォルトでは、JDK内の強力なカプセル化
デフォルトでは、sun.misc.Unsafeなどの主要な内部APIを除いて、JDKのすべての内部要素が強力にカプセル化されています。エンドユーザーは、緩い強力なカプセル化を選択できます。これは、JDK9以降のデフォルトのカプセル化です。JDKのセキュリティと保守性を向上させます。
封印されたクラス
封印されたクラスとインターフェースを使用して、Javaプログラミング言語を強化します。封印されたクラスとインターフェースは、他のクラスまたはインターフェースを制限して、それらを拡張または実装します。
public abstract sealed class SealedHuman permits Student, Teacher {
protected final String name;
public abstract void speak();
public SealedHuman(String name) {
this.name = name;
}
}
public final class Student extends SealedHuman {
public Student(String name) {
super(name);
}
public void speak() {
System.out.println("student name:" + name);
}
public void study() {
System.out.println(name +" is studying");
}
}
public final class Teacher extends SealedHuman {
public Teacher(String name) {
super(name);
}
public void speak() {
System.out.println("Teacher name:" + name);
}
public void teach() {
System.out.println(name +"is teache");
}
}
jdk16の公式説明:https://www.oracle.com/news/announcement/oracle-announces-java-16-031621.html公式
ダウンロードアドレス:https://www.oracle.com/java/technologies/javase-downloads .html