JAVA

Java 22 の主要変更点と Java 21 との比較 – 移行チェックリスト

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

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, Double> {
@Override public Supplier> initializer() { return ArrayDeque::new; }

}

// 使用例
List data = List.of(1,2,3,4,5);
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 の導入

  • 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. コードベースのスキャン

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. 本番リリース前の最終チェック

  1. 全ビルド成功sdk use java 22-tem && ./gradlew clean build
  2. プレビューオプションが残っていないかgrep -- '--enable-preview' -R src/main/java
  3. 依存関係のバージョン更新(Maven Central の最新リリースを参照)
  4. ドキュメント・サンプルコードの更新(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 がもたらす開発効率向上を、安定した運用基盤の上で最大限活用できるはずです。

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-JAVA