Contents
Java 22 の概要 ― 2024 年 3 月リリースの実務向きハイライト
Java 22 は 2024 年 3 月 に正式リリースされた Feature Release(LTS ではありません)です。
本稿では、開発者がすぐに活用できるプレビュー機能や API の追加点を中心に解説し、実務での移行・検証手順を提示します。
- 対象読者:Java 21(またはそれ以前)からのアップグレードを検討中のエンジニア、チームリーダー
- 結論:プレビュー機能は安全に試せる環境が整っており、特にパターンマッチング系と仮想スレッドの改善は生産性向上に直結します。
公式情報: https://openjdk.org/projects/jdk/22/
プレビュー機能の全容と有効化手順
パターンマッチング for switch(JEP 441)
パターンマッチングが switch 文に拡張され、型チェックとデコンストラクトを同時に記述できます。実務で頻繁に出てくる条件分岐の可読性が大幅に向上します。
|
1 2 3 4 5 6 7 8 9 |
static String describe(Object obj) { return switch (obj) { case Integer i -> "整数: " + i; case String s -> "文字列: " + s; case null -> "null 値"; default -> "その他の型"; }; } |
ポイント
- case ラベルで型を直接指定できる。
- 従来の instanceof とキャストが不要になるためコード行数が削減。
Implicitly Declared Classes & Instance Main Methods(JEP 463)
JEP 463 は プレビュー として Java 22 に導入され、クラス宣言を省略した「暗黙のクラス」で main メソッドを書けます。
|
1 2 3 4 5 6 |
// ファイル名は任意。拡張子 .java のみでコンパイル可能 void main() { var msg = "Hello, Java 22!"; System.out.println(msg); } |
- 暗黙のクラス:
public classを明示しなくてもトップレベルにメソッドを書ける。 - インスタンス
main:staticではなくインスタンスメソッドとしてmainが定義可能(内部でthisが利用できる)。
この機能はスクリプト的なプロトタイプや学習用コードに最適です。ただし本番環境へ導入する際は プレビューフラグ の付与が必須です。
プレビュー有効化の共通手順
| ステップ | コマンド例(Java 22) |
|---|---|
| コンパイル | javac --enable-preview -source 22 MySample.java |
| 実行 | java --enable-preview MySample |
IDE(IntelliJ IDEA、Eclipse、VS Code 等)でも「Enable preview features」設定をオンにすると同等の効果が得られます。
留意点:プレビュー機能は次バージョンでシグネチャが変更される可能性があります。長期的な本番コードへの組み込みは推奨しません。
主要 API の新展開
Foreign Function & Memory API(Incubator, JEP 434)
Java 22 では 第三世代 の外部関数・メモリ API が Incubator として提供され、C/C++ ライブラリとの相互運用が従来よりシンプルになりました。
|
1 2 3 4 5 6 7 8 9 |
import java.lang.foreign.*; import static java.lang.foreign.ValueLayout.*; MemorySegment seg = MemorySegment.allocateNative(JAVA_INT); VarHandle vh = JAVA_INT.varHandle(); vh.set(seg, 0, 42); // ネイティブメモリに整数を書き込む int v = (int) vh.get(seg, 0); // 読み出し System.out.println(v); // → 42 |
- 安全性:バウンダリチェックが自動で行われ、セグメントのライフサイクル管理も API が担保。
- プレビュー:
--enable-preview必要。将来 LTS に昇格予定です。
仮想スレッド(Project Loom)機能強化
Java 22 では仮想スレッドの起動コストが約 30% 削減され、デバッグ情報も充実しました。既存コードをほぼそのまま Thread.startVirtualThread(Runnable) に置き換えるだけで効果が得られます。
|
1 2 3 4 5 |
Thread.ofVirtual().start(() -> { // 高並行性タスク例 System.out.println("Running in virtual thread: " + Thread.currentThread()); }); |
- メリット:数十万スレッド規模の I/O バウンドアプリでもメモリ使用量が抑えられ、スケーラビリティが向上。
- 注意点:CPU バウンド処理は従来のプラットフォームスレッドと組み合わせて使用する方が効率的です。
SDKMAN! を使ったインストール手順(Mac/Linux)
前提と概要
SDKMAN! は複数バージョンの JDK を簡単に切り替えられるツールで、CI/CD パイプラインでも広く利用されています。以下では OpenJDK 22 の取得例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# SDKMAN! 本体のインストール(初回のみ) curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" # JDK 22 (OpenJDK) をインストール sdk install java 22-open # デフォルトバージョンに設定 sdk default java 22-open # バージョン確認 java -version |
主なディストリビューション比較
| ディストリビューション | LTS サポート | 商用利用可否 | 特徴 |
|---|---|---|---|
| Eclipse Temurin | 6 か月ごと更新 | 可 | オラクルのバイナリに近い互換性 |
| Amazon Corretto | 3 年間長期サポート | 可 | AWS 環境との親和性が高い |
| Azul Zulu | LTS (8‑21) | 有料プランあり | 商用向けパフォーマンスチューニング |
どのディストリビューションでも sdk install java 22-open で同一コマンドが利用でき、環境統一が容易です。
Java Playground(オンライン REPL)での手軽な検証
Oracle が提供する Java Playground はブラウザ上で JDK 22 のプレビュー機能を試すことができます。
- https://play.oracle.com にアクセス
- エディタにサンプルコード(例:
void main() { … })を貼り付け - 「Run with preview」ボタンをクリック →
--enable-previewが自動付与され、実行結果がコンソールに表示
※ 本番環境では必ずローカル JDK を使用し、CI でのテストも忘れずに設定してください。
移行チェックリストとベストプラクティス
| 項目 | 推奨アクション |
|---|---|
| JDK バージョン | SDKMAN! で java 22-open をインストールし、プロジェクトのビルドツール(Maven/Gradle)に sourceCompatibility = 22 を設定 |
| プレビュー機能 | --enable-preview を必ず付与し、CI パイプラインでも同フラグを使用 |
パターンマッチング for switch |
条件分岐が多い箇所で置換テスト。既存の instanceof+キャストコードを比較的簡潔にリファクタリング可能 |
| JEP 463(暗黙クラス) | スクリプト・学習用モジュールで採用し、パッケージ構造が不要になるケースを確認 |
| Foreign Function & Memory API | ネイティブライブラリ呼び出しのプロトタイプを作成。--enable-preview が必要な点に注意 |
| 仮想スレッド | I/O バウンド処理(HTTP クライアント、データベース接続等)で Thread.ofVirtual() に置き換え、パフォーマンス測定を実施 |
最終的な推奨:本番リリース前に ステージング環境 で上記チェックリストをすべて通過させることが、安全かつスムーズな移行の鍵です。
参考リンク(公式)
- Java 22 Release Notes https://openjdk.org/projects/jdk/22/
- JEP 441 – Pattern Matching for
switch(preview) https://openjdk.org/jeps/441 - JEP 463 – Implicitly Declared Classes & Instance Main Methods (preview) https://openjdk.org/jeps/463
- JEP 434 – Foreign Function & Memory API (incubator) https://openjdk.org/jeps/434
- SDKMAN! Documentation https://sdkman.io/
本稿は 2026 年 6 月時点の公式情報に基づき作成しています。機能の正式リリースや API の安定化状況は今後変更される可能性がありますので、導入前に最新ドキュメントをご確認ください。