世界を動かす技術を、日本語で。

Java 25が正式にリリースされました

概要

JDK 25(Java 25)の正式リリース発表 GAビルド(build 36)が本番利用可能 OracleからのOpenJDKビルド提供開始 18件の主要JEP(新機能・改善)が含まれる 多数の小規模な改善とバグ修正も実施

JDK 25 正式リリースのお知らせ

  • JDK 25 (Java 25)の リファレンス実装正式(GA)リリース
  • build 36Release Candidate 2 として8月15日に公開、以降P1バグ報告なし
  • build 36 がそのまま GAビルド として本番利用可能
  • Oracle提供のGPLライセンスOpenJDKビルド がこちらで入手可能:https://jdk.java.net/25
  • 他ベンダーからのビルド も近日中に提供予定

JDK 25 の主な新機能(JEP一覧)

  • JEP 470: 暗号オブジェクトのPEMエンコーディング(プレビュー)
  • JEP 502: 安定値(プレビュー)
  • JEP 503: 32-bit x86ポートの削除
  • JEP 505: 構造的並行性(第5プレビュー)
  • JEP 506: スコープ付き値
  • JEP 507: パターン、instanceof、switchでのプリミティブ型(第3プレビュー)
  • JEP 508: Vector API(第10インキュベーター)
  • JEP 509: JFR CPUタイムプロファイリング(実験的機能)
  • JEP 510: キー導出関数API
  • JEP 511: モジュールインポート宣言
  • JEP 512: コンパクトなソースファイルとインスタンスmainメソッド
  • JEP 513: 柔軟なコンストラクタ本体
  • JEP 514: Ahead-of-Timeコマンドラインエルゴノミクス
  • JEP 515: Ahead-of-Timeメソッドプロファイリング
  • JEP 518: JFR協調サンプリング
  • JEP 519: コンパクトオブジェクトヘッダ
  • JEP 520: JFRメソッドタイミング&トレーシング
  • JEP 521: Generational Shenandoah

その他の改善点

  • 数百件の 小規模な機能追加や改善
  • 数千件の バグ修正 を実施
  • 設計・実装・テスト・バグ修正 など、貢献者全員への感謝

参考情報

  • JDK 25全体の詳細やJEP一覧 : https://openjdk.org/projects/jdk/25/
  • 発表元 :Mark Reinhold(Oracle)
  • 今後も他ベンダーからのリリースや追加情報 に注目

Hackerたちの意見

新機能: https://openjdk.org/projects/jdk/25/ Java 25はLTSリリースだよ。

10年後にアプリケーションを17からJava 25に移行する仕事ができるのが待ちきれない!

くそ、まだ構造化並行処理のフルリリースが来てないのか。あれがめっちゃ楽しみなんだよね。でも、Scoped Valuesがここにあるのは嬉しい!これで「Railsみたいな」ものを書くのが楽になる。大きな「static final」のスープや、あちこちに神オブジェクトを渡す必要がなくなるからね。

構造化並行処理がasync/awaitよりも良い感じになることを願ってる。例を見てると自信が持てないけど、どうなるか見てみよう。

プレビューがある方が、今のC++が実装なしで機能を標準化しようとしてる混乱よりずっと良いね。

Java 25の新機能の良い概要だね: https://www.baeldung.com/java-25-features

Javaは本当に素晴らしい技術基盤だよ…長い間そうだったし!セクシーな言語ではないかもしれないけど、安定してる。Java 1.4で作ったアプリがJava 21 LTSで元気に動いてるし、最新のLTS(Java 25)にアップグレードする予定だよ。Java最高!

ちょっと脱線するけど、2009年に僕のタッチSymbianフォンで動いてたJavaで作られたGmailアプリをまだ覚えてるよ。めっちゃ可愛くて、ちゃんと仕事もしてくれた。

いいね、昔に書いたスイングアプリを復活させようかなって考えてたんだけど、ほとんどおもちゃみたいなもんだからあんまり修正したくなかったんだ。でも、やってみるつもり!

JetBrainsの素晴らしいツールや賢い学生プログラムがなかったら、今のJavaはどうなってたんだろうね。

JVMとそのエコシステムは、Scalaみたいな他の言語からも使えるよ。Scalaにはセクシーな機能がいっぱいあるし、Clojureとかもね。

それには同意できないな。私の経験とは全然違うよ。手伝った会社は何十社もあったけど、JVMの新しいバージョンに移行するのに苦労してた。毎回、大きな問題があって、再作業や再テストがたくさん必要だった。Java 17か18のあたりで離脱したけど、関わってた誰もそのバージョンを使ってなかったから関係なかった! 2022年の特にひどいプロジェクトでは、クライアントが内部システムのJVMを1.5から更新する必要があって、私の役割はその効果を判断することだった。すぐにいくつかの重要なライブラリがJava 1.7のあたりでサポートを終了していて、進む道がないことがわかった。単に廃止された製品だったんだ。私のチームはその3rdパーティのjarのソースコードを取得して再コンパイルしようとしたけど、範囲が広がっていくばかりだった。1.7にするのも問題になるって私が言っても聞いてくれなかった。さらに、あるマネージャーが私の評価を信じず、別の人を連れてきて私が間違ってることを証明しようとした。大きな対立になってしまって、正直うんざりしたよ。その人は私ほど経験がなかったのに、ただ自信過剰で傲慢だった。結局、そのクライアントを切ることにしたけど、彼らはフォーチュン10のトップだったから残念だった。最後に聞いたとき、彼らはそのアップグレードに進展がなく、まだ1.5を使っている状態だったよ。

コンストラクタでsuperを呼ぶ前にパラメータの検証と変換を許可するのにこんなに時間がかかるなんて、信じられない。これがずっと気になってたんだよね、直感に反する感じがして。

特に、static関数を宣言して、それをsuperのパラメータの一部として呼び出すことでいつでもバイパスできたからね。public Foo(int x) { super(validate(x)); } validateはsuperの前に実行されるのに、superは技術的にはコンストラクタの最初の文だったし、コンパイラもそれで満足してた。

JDK 1.0の前からJavaをプログラミングしてるけど、その頃気になってたミスフィーチャーは、もうずいぶん前に対処法を学んだよ。

それってJava 22からできなかったっけ?

最近、JDK8からの移行を決断したんだ。17じゃなくて21にすることにした理由の一つは、25がすぐそこにあるから。僕が見た感じ、最大のハードルは8から11(新しいモジュールシステム)だけど、そこを越えればあとはスムーズだよ。POCはJDK17でやったけど、そのままJDK21でも動いた(ただしGuiceはメジャーバージョンアップが必要だった)。もちろん、JavaそのものじゃなくてJVM言語を使ってるのも助けになったかもね。

8から17歳の頃は、使っちゃいけないもの(Sunパッケージ)が消えて大変だった。でも、たくさんのライブラリはそれでも動いてたしね。javaxからjakartaへの移行も大変だったけど、それを乗り越えれば大丈夫。21や25に行くのは簡単そうに見えるよ。新機能が追加されるだけで、長い間必要だった整理が終わったからね。これからは最新の状態を保つのがずっと楽になると思う。

そうだね、Java 9はエコシステムのPython 3の瞬間だったけど、もうずっと前から解決されてるよ。

参考までに、最近17から21に移行するのに全く問題はなかったよ。すべてうまくいったし、唯一の小さな問題はGradleを同時にアップグレードすることだったけど、それはあまり関係なかった。

頑張ってね!

(Java開発者じゃないから、特に関係ないけど)モジュールインポートシステムがあんまり好きじゃないな。import *みたいな構文はコードを書くのをちょっと楽にするけど、特に新しい開発者には読みづらくなると思う。C#やNimはそのスタイルが好きだけど、良いIDEがないとほとんど読めなくなるよ。個人的にはPythonの「短いエイリアス」スタイルが好きだな、例えばimport torch.nn.functional as Fみたいに。

モジュールインポートは普通のインポートとは違って、実際に開発者が書かなきゃいけないインポートの数を減らすのに役立つみたいだね。ちなみに、Javaで動くScalaはインポートのリネーミングや型エイリアスもあって、君が言ったことができるよ。

大規模なコードベースでは、インポートの主な問題は「そのものがどこから来たか」だよね。明示的なインポートが本当に必要なんだ。特にビルドで何かが壊れた時、依存関係の正しいバージョンがあるかどうか不安になるし(その名前がどの依存関係から来たのか分からない)。小規模なコードベースでは何でも動くけど。追記:なんでインポートを見る必要があるの?普通のエディタなら隠してくれるし、必要ないよ。コードから名前をクリックしたりホットキーで直接ナビゲートすればいいんだから。

知ってる限りでは、主に単一ソースファイルのプログラムを書くのを楽にするためのものだよ。

C#とNimはそのスタイルが好きだけど、良いIDEがないとほとんど読めなくなるよね。C#の開発体験が嫌になる理由の多くは、フル機能のVisual Studioを使わないからだと思う。VSCodeは素晴らしいけど、csprojやslnファイルを開くことはまずないかな。実際のXML内容を手動で編集する必要があるときだけだよ。500ドルで永続的かつ完全ライセンスのコピーが買えるってことはあまり知られてないけど、サブスクリプションや他の怪しいクラウド詐欺みたいなものは必要ないんだ。ただ、マイクロソフトの製品ページを見てると、そう思わせるような作りになってるけどね。[0] https://www.microsoft.com/en-us/d/visual-studio-professional...

IDEなしでは意味がわからない言語構造についての不満は理解できないな。IDEがあるんだから、そこでコードを見てるわけでしょ。IDEを持ってない人は自分で問題を作ってるだけだから、やめた方がいいよ。GitHubでコードを見てる人は、通常は参照を細かく追うレベルで分析してるわけじゃないし、簡潔さが時々のイライラを大きく上回ると思う。

新しいプログラムはもっとJavaやJVM上で書かれるべきだと思う。Javaが人気を失った理由のほとんどはもう当てはまらないし、今はすごく安定して成熟したエコシステムになってる。10年前に書いたClojureのプログラムを今見てもちゃんと動くけど、6ヶ月前に書いたTypeScriptのプログラムは更新や整理がたくさん必要なんだよね。

僕が見る限り、Javaは冗長で使うのが退屈だから人気がないんだよね。正直言って、今はそれが大きな問題だとは思わない。Clojureのプログラムの方が好きだけど、今のところはJavaの方がTypeScriptよりマシだな。

多分、マルチスレッドのサービスをシングルスレッドのワーカーに置き換える人が増えてるのが関係してるんじゃないかな。

ひそかにKotlinとComposeがJVM上でデスクトップアプリを復活させてくれることを期待してるんだよね :-)

Javaはめっちゃ人気があって、大規模なバックエンドシステムで広く使われてるよね。ここにいる人たちは、そんなシステムで働いてないのかな?親のコメントみたいなのを見るといつも驚くんだよね。キャリアの中でJavaに触れる機会はほぼ無限にあったから。

Javaは中規模から大規模プロジェクト、特にスレッド処理や複雑なIOが必要なものには最適な言語だと思う。最近、ハードウェアアーキテクチャがまた分散してきてるから、もっと重要になってほしいな。SpringフレームワークはJavaの評判を下げてる気がする。Spring Bootはマシだけど、やっぱり厄介だよね。残念ながら、Pythonが勝った気がする。大体のことには十分だけど、実際は結構クソだよね。最近はRustを使ってプロダクションのAIシステムを作ろうとしてる人もいるみたい。

Javaの継続的な採用に対する最大のリスクは、周囲の文化だと思う。古いJavaプログラマーや古いJavaプログラムは、今の言語が他の人気のある現代的な言語と同じくらい簡潔にできるツールを持っているのに、無駄に冗長なままだよね。厳しい戦いだけど、まだ巨大な存在だから、もしかしたらその山を登れるかもしれない。

Oracleはなんか不安だな。Oracleの怒りを買わずにJavaを使えるかな?多分、openjdkを使ったり、いろいろ工夫すれば大丈夫かも。でも、他の言語を使ってその心配をしなくてもいいならそっちの方がいいな。C#は、Oracleに膝を壊される不安なしにJavaっぽい体験ができるから、すぐそこにあるし。Javaの使い方が分からないし、OracleのEULAに違反しない方法も知らない。調べて安全に使う方法を見つけることもできるけど、Javaを使わない選択肢もあるよね。Javaは必須じゃない(グリーンフィールドプロジェクトには)。良い代替がたくさんあるから、そっちを選びたいな。

Javaの一番の問題は、スムーズじゃないことだね。使えるjdkの実装がいくつもあって、ビルドシステムも色々あるし。C#のエコシステムは確かに小さいけど、ずっとスムーズだよ。

10年前に書いたClojureプログラムに戻ると、ちゃんと動くんだ。これはJVMのおかげなのか、それともClojureの動き方のおかげなのか? Clojurescriptプロジェクトでも同じような話があるよ。古いnbbスクリプトを取ってきても、そのまま動くし。たまにnpmの依存関係を更新しないといけないこともあるけど、大体はひどく壊れてることはないよ。一方で、5つの相互依存するスクリプトを動かすために、変なPythonの依存関係やvenvの魔法のダンスに半日もかけたばかりなんだ。

Javaはほとんどの命令型言語と同じ問題を抱えてるんだ。可変状態と不変状態の明確な分離がなくて、ツールによって厳密に強制されてないからね。多くの大規模なJavaプログラムは不変コレクションを使ってこの問題を回避しようとするけど、確かに効果はあるけど限界がある。Javaはオブジェクト指向でもあるから、ストレスがかかるとスパゲッティの親子関係になっちゃうんだよね。

僕の感じでは(その価値はさておき)、Javaは古い言語としてこの10年間改善されてきたけど、C++は悪化してると思う。

プロジェクトValhallaがまだ完成してないのは本当に残念だよ。これが完成すれば、たくさんの問題が解決して、Javaの行列計算サポートも良くなるのに。

つい2週間前に提出されたから、今後のリリースでも何か見られるかもしれないね。

プロジェクトValhallaは、一回のリリースで実現するには大きすぎるよ。表面的な言語やJVMへのすべての変更が実現しても、新しい最適化を追加するのはまだ始まりに過ぎないからね。

バルハラのことを初めて聞いたのは2014年だったと思うから、もう10年以上前だね!でも、Javaの設計には本当に満足してる。こんなに丁寧に開発された技術って、ほんとに珍しいよ。長期的な安定性を求めるなら、Javaが最適だね。