エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Java19事前調査

Javaの新バージョンリリースの時期になってきたので、調査内容まとめる

JDK 19

公式サイト

JDK 19

Java19追加機能

405: Record Patterns (Preview) 422: Linux/RISC-V Port 424: Foreign Function & Memory API (Preview) 425: Virtual Threads (Preview) 426: Vector API (Fourth Incubator) 427: Pattern Matching for switch (Third Preview) 428: Structured Concurrency (Incubator)

環境準備

sdkmandで入れ替え

$ sdk install java 19.ea.36-open

詳しい使い方は、過去記事で suzaku-tec.hatenadiary.jp

機能検証

405: Record Patterns (Preview)

JEP 405: Record Patterns (Preview)

本文のサマリーをDeepLかけた結果

概要

レコードパターンを使って、Javaプログラミング言語を強化し、レコード値を分解する。レコードパターンとタイプパターンをネストすることで、強力で宣言的、かつ複合的なデータナビゲーションと処理を可能にする。これはプレビュー言語の機能である。

試し実装

本文を読んだ感じ、キャスト後の値のアクセスが楽になるような感じらしい。

とりあえず、試し実装

public class Java19_405 {

  record Point(int x, int y) {}
  enum Color { RED, GREEN, BLUE }
  record ColoredPoint(Point p, Color c) {}
  record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}

  public static void main(String[] args) {
    Rectangle r = new Rectangle(new ColoredPoint(new Point(1, 2), Color.RED),
                            new ColoredPoint(new Point(2, 4), Color.GREEN));
    printUpperLeftColoredPoint(r);
  }

  static void printUpperLeftColoredPoint(Rectangle r) {
    if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
         System.out.println(ul.c());
    }
  }
}

実行方法は、以下の通り

$ javac --enable-preview --release 19 Java19_405.java
$ java --enable-preview Java19_405

注目してほしいのは、if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr))のあたり。
次の行で、直接ulにアクセスできるようになっている。

前までは、Rectangleのrからアクセスしてたけど、その必要性がない。

所感

VBAにあるwith~endと似たようなものだと感じた。
何か、問題を抱えてそうな気がしないでもないんだが、どうなんだろう?
switch式が書いてあったが、あまり有効さを見いだせてないので、一旦スルー

JEP 422: Linux/RISC-V Port

本文のサマリーをDeepLかけた結果

JDKをLinux/RISC-Vに移植する。

開発に影響なさそうなので、スルー

JEP 424: Foreign Function & Memory API (Preview)

本文のサマリーをDeepLかけた結果

JavaプログラムがJavaランタイム外のコードやデータと相互運用するためのAPIを導入する。外来関数(JVM外のコード)を効率的に呼び出したり、外来メモリ(JVMが管理していないメモリ)に安全にアクセスすることで、JavaプログラムはJNIの脆さや危険性なしにネイティブライブラリの呼び出しやネイティブデータの処理を行うことができるようになるAPIです。本APIはプレビュー版です。

環境準備するのが難しいので、試し実装なし

所感

JNIの実装は、何回か経験がある。
面倒くさいってことしか記憶にない。
もうちょい寝かしておこう。。。

JEP 425: Virtual Threads (Preview)

JEP 425: Virtual Threads (Preview)

本文のサマリーをDeepLかけた結果

Java プラットフォームに仮想スレッドを導入します。仮想スレッドは、高スループットの並列アプリケーションを書き、維持し、観察する労力を劇的に削減する軽量なスレッドです。このAPIはプレビュー版です。

所感

実装内容に影響はなさそう。
この対応が入ることで、StreamAPIのスレッド生成のコストが下がるのだろうか?
ところどころにStreamAPIってあるので、影響あると思うが、有識者に話聞かないと理解できなさそう。

JEP 426: Vector API (Fourth Incubator)

JEP 426: Vector API (Fourth Incubator)

本文のサマリーをDeepLかけた結果

ベクトル計算を表現するAPIを導入し、サポートするCPUアーキテクチャ上で最適なベクトル命令に実行時に確実にコンパイルし、同等のスカラー計算を上回る性能を達成する。

所感

ベクトル計算のAPIか。。
おそらく、背景には機械学習とかが影響してるんだろうな。。。
すぐ試すのは難しそうだったのでスルー

JEP 427: Pattern Matching for switch (Third Preview)

JEP 427: Pattern Matching for switch (Third Preview)

三回目のプレビューなので、スルー

JEP 428: Structured Concurrency (Incubator)

JEP 428: Structured Concurrency (Incubator)

本文のサマリーをDeepLかけた結果

構造化並行処理のためのAPIを導入することにより、マルチスレッドプログラミングを簡素化する。構造化並行処理は、異なるスレッドで実行される複数のタスクを一つの作業単位として扱うことで、エラー処理やキャンセル処理の効率化、信頼性の向上、観測性の強化などを実現する。本APIはインキュベーティングAPIである。

実験機能なので、スルー

雑感

実験機能が多い。
そこまで開発影響あるものはないが、実験機能は、試すための準備が面倒なものが多い。

実験機能は、どこかでスキを見て、ちゃんと試したい