Contents
Java 22 リリース概要(2024‑03‑21 GA)
| 項目 | 内容 |
|---|---|
| GA 日 | 2024‑03‑21 (OpenJDK 22 の公式リリースノート掲載) |
| LTS 判定 | 非 LTS リリース。Oracle の長期サポート(LTS)は 2 年ごとで、直近は Java 21 (2023‑09) 。次回の LTS は Java 23(予定) だが、正式に「Java 23 が LTS」になるかは現在も未発表。 |
| リリースサイクル | 6 ヶ月ごとに新機能を取り込む Feature Release。短期間で言語・API の実験的改良が行われ、LTS 前のステップとして位置付けられる。 |
注記:本稿執筆時点(2026‑04‑21)では、Oracle が次期 LTS を Java 23 と明示していないため、「Java 23 が次期 LTS」 という表現は避け、「次期 LTS は未確定だが、現在のロードマップでは Java 23 が候補に上がっている」 と記す。
主な言語機能(プレビュー含む)
| JEP | タイトル | ステータス (JDK 22) | 概要 |
|---|---|---|---|
| 430 | Unnamed Variables & Patterns | Final | 使わない変数を _ で表現でき、パターンマッチングでも同様に名前省略が可能。例外捕捉やラムダ式の記述が簡潔になる。 |
| 463 | Implicitly Declared Classes & Instance Main Methods (Second Preview) | Preview | void main() だけで暗黙的にクラスとエントリーポイントを生成する構文。Java 22 は 第二段階プレビュー で、API が将来変更される可能性がある。 |
| 473 | Stream Gatherer (Preview) | Preview | 従来の Collector に代わり、状態機械的にストリーム集約を記述できる新しいインタフェース java.util.stream.Gatherer を提供。 |
1. Unnamed Variables & Patterns(JEP 430)
- 使い方
java
try {
// …
} catch (IOException _) { // 例外オブジェクトは不要
System.err.println("I/O error");
}
var list = List.of("a", "b");
for (var _ : list) { / 要素を使わないループ / }
filter など、引数を無視するケースで可読性向上。
- **メリット**
- 未使用変数の宣言が冗長でなくなる。コードレビューでの指摘削減に寄与。
- ラムダ式やストリームの
- 注意点
- Java 21 以前ではコンパイルエラーになるため、移行時は全ソースを検索し置換する自動化スクリプト(例:
grep -R "catch (.* _)")が推奨される。
2. Instance Main の第二段階プレビュー(JEP 463)
- 構文例
java
void main() {
System.out.println("Hello, Java 22!");
}
コンパイラは内部で以下を生成する(概念的に):
java
public final class Main {
public static void main(String[] args) { /* 上記コード */ }
}
- 活用シーン
- 小規模ツール、PoC、教育教材などで「スクリプト感覚」の Java が求められる場面。
-
java MyFile.javaのようにファイル単体で実行できるため、ビルド設定が不要。 -
リスク
- プレビュー機能は最終仕様になるまで API(例:
void main()のシグネチャや暗黙的クラス名)が変更され得る。商用プロジェクトでは従来のpublic static void main(String[])を残して互換性を確保することが安全策となる。
3. Gatherer API(JEP 473)
- インタフェース定義(抜粋)
java
public interface Gatherer<T, A, R> {
Supplier<A> initializer(); // 初期状態生成
BiFunction<A, T, A> accumulator(); // 要素受取時の状態遷移
Function<A, R> finisher(); // 最終結果への変換
}
- 典型的な利用例:ウィンドウ集計(移動平均)
java
import java.util.;
import java.util.function.;
import java.util.stream.*;
record MovingAverage(int window) implements Gatherer
@Override public Supplier
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Override public BiFunction<Deque<Integer>, Integer, Deque<Integer>> accumulator() { return (dq, e) -> { if (dq.size() == window) dq.removeFirst(); dq.addLast(e); return dq; }; } @Override public Function<Deque<Integer>, Double> finisher() { return dq -> dq.stream() .mapToInt(Integer::intValue) .average() .orElse(Double.NaN); } |
}
// 使用例
List
double avg = data.stream()
.gather(new MovingAverage(3))
.findFirst()
.orElse(Double.NaN);
System.out.println("Windowed average: " + avg); // → 4.0
- 特徴
Collectorが「一次的」な集約に特化しているのに対し、Gathererは 状態遷移 を明示できるため、ウィンドウ処理やストリームベースの ETL に適する。- 現在は プレビュー(JEP 473)であり、シグネチャ変更や追加メソッドが将来起こり得る。
開発ツールとインストール手順
SDKMAN! による Java 22 の導入
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 1. SDKMAN! が未導入の場合はインストール curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" # 2. 利用可能な JDK を一覧表示 sdk list java # 3. Temurin 22(例)をインストール sdk install java 22-tem # 「tem」は Eclipse Temurin のエイリアス # 4. デフォルト JDK に設定(任意) sdk default java 22-tem |
- Windows ユーザーは
scoop(scoop install openjdk22) またはchocolatey(choco install temurin22) を利用可能。
Java Playground(ブラウザ上実行環境)
| 特徴 | 説明 |
|---|---|
| 即時実行 | JDK をローカルにインストールせず、コードスニペットを数秒でコンパイル・実行できる。 |
| 新機能サンプル | Java 22 の Unnamed Variable や void main() のデモが随時追加されている。 |
| 用途 | 勉強会のライブコーディング、プレビュー機能の試験、依存関係が不要な小規模テスト。 |
商用利用可能なオープンJDK ディストリビューション(2026‑04 時点)
| ディストリビューション | 無償商用利用可否 | 主な提供元 |
|---|---|---|
| Eclipse Temurin | 可 | Eclipse Foundation |
| Amazon Corretto | 可 | AWS |
| Azul Zulu (Community) | 可 | Azul Systems |
| Microsoft Build of OpenJDK | 可 | Microsoft |
| Oracle OpenJDK (GPL) | 可 | Oracle |
注意:本表は「無償で商用利用できる」オープンソース版を示す。長期サポートや SLA が必要な場合は、各ベンダーの有料サブスクリプションを検討すること。
移行チェックリストとベストプラクティス
1. 環境整備
| 手順 | コマンド例 |
|---|---|
| JDK 22 のインストール | sdk install java 22-tem |
| IDE の JDK 設定更新(IntelliJ/VS Code/Eclipse) | プロジェクト構成 → SDK → Java 22 |
| ビルドツールのバージョン設定 | Maven: <java.version>22</java.version> Gradle: java { toolchain.languageVersion = JavaLanguageVersion.of(22) } |
2. コードベースのスキャン
|
1 2 3 4 5 |
# Unnamed Variable への置換候補抽出(例:catch 文) git grep -n "catch (" | grep -v "_" # Instance Main が利用できるファイルを検索 git ls-files '*.java' | xargs grep -L "void main()" |
3. 非互換変更の確認
| 項目 | 内容 |
|---|---|
| パッケージ ↔ ディレクトリ整合性 | java MyApp.java 実行時、パッケージ宣言とフォルダ構造が完全一致しなければコンパイルエラーになる。CI に javac -Xlint:all を組み込み、エラー有無を自動検出する。 |
| Preview 機能の使用 | プレビューは --enable-preview オプションが必須。ビルドスクリプトにフラグを追加し、CI でも同様に設定すること。 |
4. 新機能の試験導入
| 機能 | 推奨テスト規模 |
|---|---|
| Unnamed Variable / Patterns | 小規模モジュールでコンパイル・実行テスト、コードスタイルチェック(Spotless 等)に _ の使用を許容するルール追加。 |
| Instance Main (第二段階プレビュー) | PoC アプリケーション (HelloWorld.java) を作成し、java --enable-preview HelloWorld.java で実行。IDE の Run 設定にも --enable-preview を付与。 |
| Gatherer API | ストリームベースの集計ロジック(例:ログ集計)を PoC として実装し、パフォーマンスベンチマークとユニットテストで動作保証。 |
5. テスト範囲の拡大
- 単体テスト:新構文・API を使用したクラスは必ず JUnit(Jupiter)でカバレッジ ≥ 80 % を目指す。
- 統合テスト:
void main()が含まれるモジュールは、実行可能 Jar の生成と起動スクリプトの検証を CI に組み込む。 - 互換性テスト:Java 21 でビルドしたアーティファクトが Java 22 上でも問題なく動作するか
mvn verify -DskipTests=falseで確認。
6. 本番リリース前の最終チェック
- 全ビルド成功(
sdk use java 22-tem && ./gradlew clean build) - プレビューオプションが残っていないか(
grep -- '--enable-preview' -R src/main/java) - 依存関係のバージョン更新(Maven Central の最新リリースを参照)
- ドキュメント・サンプルコードの更新(README に
--enable-previewが必要な旨記載)
今後の展望と LTS への位置付け
| 観点 | 現状 (Java 22) | 将来予測 |
|---|---|---|
| LTS ロードマップ | Java 21 が現在唯一の LTS。次期 LTS は未確定だが、Oracle の 2 年サイクルからは 2025‑09 に新しい LTS が登場する可能性が高い(候補は Java 23)。 | |
| 機能的継続性 | Unnamed Variable と Gatherer はプレビューから正式化へ移行の可能性あり。Instance Main も同様に最終仕様化が期待される。 | |
| 開発者体験 | プレビュー機能を利用した実装は、次期 LTS に向けた「試金石」になるため、早期導入とテスト自動化が推奨される。 |
戦略的提案:Java 22 をベースラインとして、非互換変更のリスクを最小限に抑えつつ新機能の PoC を社内で実施する。その上で、次期 LTS(仮に Java 23 と想定)への段階的移行計画を策定すれば、長期的な保守コスト削減が見込める。
まとめ
- リリース日は正式に 2024‑03‑21。
- LTSではなく、機能実験の場として位置付けられる。
- 主要機能:Unnamed Variables & Patterns(JEP 430, Final)、Instance Main の第二段階プレビュー(JEP 463, Preview)および Stream Gatherer(JEP 473, Preview)。
- 移行時の注意点は、
--enable-preview必要性、パッケージ/ディレクトリ整合性、非互換変更への CI での自動検出。 - 導入手順は SDKMAN!・Java Playground・主要オープンJDK ディストリビューションを活用し、段階的にテストと本番適用を行うことがベストプラクティス。
これらの情報を踏まえて、「Java 22 の新機能は実務でどのように価値を提供できるか」 をチーム内で議論し、移行チェックリストに沿った導入計画を策定してください。最新言語構文と API がもたらす開発効率向上を、安定した運用基盤の上で最大限活用できるはずです。