エンターテイメント!!

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

【Java】Java18 リリース内容調査

公式サイト

https://openjdk.java.net/projects/jdk/18/

リリース内容

  • 400: UTF-8 by Default
  • 408: Simple Web Server
  • 413: Code Snippets in Java API Documentation
  • 416: Reimplement Core Reflection with Method Handles
  • 417: Vector API (Third Incubator)
  • 418: Internet-Address Resolution SPI
  • 419: Foreign Function & Memory API (Second Incubator)
  • 420: Pattern Matching for switch (Second Preview)
  • 421: Deprecate Finalization for Removal

環境構築

過去記事参照

suzaku-tec.hatenadiary.jp

JEP内容調査

400: UTF-8 by Default

JEP 400: UTF-8 by Default

google翻訳

Specify UTF-8 as the default charset of the standard Java APIs. With this change, APIs that depend upon the default charset will behave consistently across all implementations, operating systems, locales, and configurations.

標準のJavaAPIのデフォルトの文字セットとしてUTF-8を指定します。 この変更により、デフォルトの文字セットに依存するAPIは、すべての実装、オペレーティングシステム、ロケール、および構成にわたって一貫して動作します。

内容に対する所感

結構、大きな変更。
ファイル入出力周りが、結構インパクトある気がする。
なので、LTS前には、ファイルのエンコードを指定して出力するように直しておく必要がある。
今まで自分がいた現場は、ファイル入出力はエンコード必須だったから、おそらく、現在動いているシステムの影響は少ない気がするが、個人で開発したりするときや新規で開発するときは、エンコードを気にしたほうがいい。

408: Simple Web Server

JEP 408: Simple Web Server

google翻訳

Provide a command-line tool to start a minimal web server that serves static files only. No CGI or servlet-like functionality is available. This tool will be useful for prototyping, ad-hoc coding, and testing purposes, particularly in educational contexts.

静的ファイルのみを提供する最小限のWebサーバーを起動するためのコマンドラインツールを提供します。 CGIまたはサーブレットのような機能は使用できません。 このツールは、特に教育のコンテキストで、プロトタイピング、アドホックコーディング、およびテストの目的で役立ちます。 

実験・検証

下記のコマンドでサーバー起動可

$ jwebserver -p {ポート番号}

下記のindex.htmlを起動した場所と同じところに置くと、上記コマンドで表示されたURLにアクセスすると、index.htmlの内容が表示できる。

<h1>hello Java18</h1>

自分は、8000番を個人開発しているサイトとバッティングするので、9000番で試した

$ jwebserver -p 9000
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving E:\dev\java\18 and subdirectories on 127.0.0.1 port 9000
URL http://127.0.0.1:9000/

内容に対する所感

起動は、軽快だった。
用途としては、簡易webサーバーとしても使えそう。
もしかすると、テストサーバー的な役割もできそうな気がしないでもない。
軽量サーバーっぽいので、複雑なことはできなさそう。

今までだと、自分は、node.jsで色々やることが多かったけど、Javaも選択肢に入るようにはなったかな?
※たぶん、node.js使う気がするが。。。

413: Code Snippets in Java API Documentation

JEP 413: Code Snippets in Java API Documentation

google翻訳

Introduce an @snippet tag for JavaDoc's Standard Doclet, to simplify the inclusion of example source code in API documentation.

JavaDocの標準ドックレットに@snippetタグを導入して、APIドキュメントにサンプルソースコードを含めるのを簡素化します。 

実験・検証

サンプルそのまま乗せる。
時間がないので、検証はまた今度。。。

/**
 * The following code shows how to use {@code Optional.isPresent}:
 * {@snippet :
 * if (v.isPresent()) {
 *     System.out.println("v: " + v.get());
 * }
 * }
 */

内容に対する所感

利用用途は、メソッドのJavadocに書いて、それの使い方のサンプルを書く感じだろうか?
おそらく、wiki的な役割を持たせたいのだろうなと感じている。

416: Reimplement Core Reflection with Method Handles

JEP 416: Reimplement Core Reflection with Method Handles

google翻訳

Reimplement java.lang.reflect.Method, Constructor, and Field on top of java.lang.invoke method handles. Making method handles the underlying mechanism for reflection will reduce the maintenance and development cost of both the java.lang.reflect and java.lang.invoke APIs.

java.lang.invokeメソッドハンドルの上にjava.lang.reflect.Method、Constructor、およびFieldを再実装します。 メソッドにリフレクションの基礎となるメカニズムを処理させると、java.lang.reflectAPIとjava.lang.invokeAPIの両方の保守と開発のコストが削減されます。 

内容に対する所感

リフレクションの内部の実装を変更するだけっぽいな。
処理を置き換えることで、保守コストの削減、パフォーマンスの向上が期待できるって、詳細の内容で言ってました。

417: Vector API (Third Incubator)

google翻訳

Introduce an API to express vector computations that reliably compile at runtime to optimal vector instructions on supported CPU architectures, thus achieving performance superior to equivalent scalar computations.

サポートされているCPUアーキテクチャで実行時に最適なベクトル命令に確実にコンパイルされるベクトル計算を表現するAPIを導入し、同等のスカラー計算よりも優れたパフォーマンスを実現します。 

内容に対する所感

あんまり詳しく理解できてないけど、CPUに最適なAPIで計算されるって理解でOK?
本リリース前に理解しておきたいが、じっくり調べる時間がない

418: Internet-Address Resolution SPI

JEP 418: Internet-Address Resolution SPI

google翻訳

Define a service-provider interface (SPI) for host name and address resolution, so that java.net.InetAddress can make use of resolvers other than the platform's built-in resolver.

java.net.InetAddressがプラットフォームの組み込みリゾルバー以外のリゾルバーを利用できるように、ホスト名とアドレスの解決のためにサービスプロバイダーインターフェイス(SPI)を定義します。 

内容に対する所感

ネットワーク周りの話はよく分からないんだよね。。。
ネットワークスペシャリストとろうと思っている身分だけど。

419: Foreign Function & Memory API (Second Incubator)

JEP 419: Foreign Function & Memory API (Second Incubator)

DeepL翻訳

google翻訳の精度にイラッとしてきたので変更

Introduce an API by which Java programs can interoperate with code and data outside of the Java runtime. By efficiently invoking foreign functions (i.e., code outside the JVM), and by safely accessing foreign memory (i.e., memory not managed by the JVM), the API enables Java programs to call native libraries and process native data without the brittleness and danger of JNI.

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

内容に対する所感

JNIを使った外部APIの呼び出しを楽にするのかな?
前に、C++で作られたライブラリ呼び出す処理を仕事で書いたことがあるのだが、結構煩雑だったのと、処理のエラーハンドリングや時間がかかってた印象。
時間があれば、もう少し調べたい。

420: Pattern Matching for switch (Second Preview)

JEP 420: Pattern Matching for switch (Second Preview)

DeepL翻訳

Enhance the Java programming language with pattern matching for switch expressions and statements, along with extensions to the language of patterns. Extending pattern matching to switch allows an expression to be tested against a number of patterns, each with a specific action, so that complex data-oriented queries can be expressed concisely and safely. This is a preview language feature in JDK 18.

Java プログラミング言語において、switch 式およびステートメントのパターンマッチングと、パターン言語の拡張を行います。switchにパターンマッチングを拡張することで、式を複数のパターンに対してテストすることができ、それぞれが特定のアクションを持つため、複雑なデータ指向のクエリを簡潔かつ安全に表現することができる。これは、JDK 18のプレビュー言語機能です。

内容に対する所感

switchアンチ民なんだけど、追ったほうが良い???

421: Deprecate Finalization for Removal

JEP 421: Deprecate Finalization for Removal

DeepL翻訳

Deprecate finalization for removal in a future release. Finalization remains enabled by default for now, but can be disabled to facilitate early testing. In a future release it will be disabled by default, and in a later release it will be removed. Maintainers of libraries and applications that rely upon finalization should consider migrating to other resource management techniques such as the try-with-resources statement and cleaners.

将来のリリースで削除するため、ファイナライズを非推奨としました。Finalizationは今のところデフォルトで有効のままですが、早期テストを容易にするために無効にすることができます。将来のリリースでは、デフォルトで無効化され、後のリリースでは削除される予定です。Finalization に依存しているライブラリやアプリケーションの管理者は、try-with-resources 文やクリーナーなど、他のリソース管理技術への移行を検討する必要があります。

内容に対する所感

finalizeが後々削除されるそうな。
finalize使っても、メモリ回収タイミングは操作できないから、使ったことないので、削除されても問題ない。

参考サイト

Java 18新機能まとめ - Qiita

Java 18正式リリース。デフォルトのCharsetが「UTF-8」に、シンプルWebサーバ搭載など新機能 - Publickey

オラクル、Java 18を発表|日本オラクル株式会社のプレスリリース

Oracle、UTF-8が標準になった「Java 18」を発表 ~簡易Webサーバーも装備(Impress Watch) - Yahoo!ニュース

Oracle、UTF-8が標準になった「Java 18」を発表 ~簡易Webサーバーも装備 - 窓の杜

Java 18リリース、デフォルトの文字コードがUTF-8に | TECH+

オラクルが「Java 18」提供開始、9つのJDK Enhancement Proposalsで改良:EnterpriseZine(エンタープライズジン)

雑記

仕事忙しすぎて、アップデートがあるのをすっかり忘れてしまった。。。

いくつか記事を見たけど、デフォルトエンコードUTF-8になるのが、大きめに取り上げられている印象。
もっと詳しく調べたいけど、直近でOCJP v11 Gold移行の試験、ネットワークスペシャリストの試験、現場の稼働高がキツイ。。。

DeepL翻訳、google翻訳と比べると、かなり精度がいいな。