Java
エンタープライズ開発で広く使われるオブジェクト指向言語で、JVM 上で動作しプラットフォーム非依存を実現する
Java とは
Java は、Sun Microsystems (2010 年に Oracle が買収) が 1995 年に公開したオブジェクト指向言語で、JVM (Java Virtual Machine) 上で動作する。「Write Once, Run Anywhere」の理念で、コンパイルしたバイトコードがどの OS でも動作する。エンタープライズ開発、Android アプリ、ビッグデータ処理で広く使われている。
リリース周期と機能の導入版
Java は 10 以降、半年ごとに新バージョンが出る。多くのベンダーが長期サポート (LTS) を提供するのは 17 (2021 年 9 月)、21 (2023 年 9 月)、25 (2025 年 9 月) の系列で、2026 年 8 月時点の最新 LTS は 25、最新リリースは 26 (2026 年 3 月) である。非 LTS 版は次の版が出るまでの半年で更新が止まるため、本番運用では LTS を選ぶのが基本になる。
近代的な文法要素は「Java 21 の新機能」としてまとめて紹介されがちだが、正式版になった版は機能ごとに違う。
| 機能 | 正式版になった JDK |
|---|---|
| Text Blocks (複数行文字列リテラル) | 15 |
| Record (ボイラープレートなしのデータクラス) | 16 |
| Sealed Classes (継承の制限) | 17 |
| Virtual Threads (goroutine 相当の軽量スレッド) | 21 |
| Pattern Matching for switch | 21 |
| Record Patterns (レコードの分解) | 21 |
21 が節目として語られるのは、17 の次の LTS としてこれらが一度に揃った版だからである。17 から移行するとまとめて使えるようになる、という意味で理解しておくとよい。
// Record: ボイラープレートなしのデータクラス
record User(String id, String name, String email) {}
// Virtual Threads: 数百万の軽量スレッド
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> handleRequest(request));
}
// Pattern Matching
String describe(Object obj) {
return switch (obj) {
case Integer i when i > 0 -> "positive: " + i;
case String s -> "string: " + s;
case null -> "null";
default -> "unknown";
};
}
TypeScript / Go との比較
TypeScript / Go との主な違いを以下に比較する。
| 観点 | Java | TypeScript | Go |
|---|---|---|---|
| 型システム | 静的 (名前的型付け) | 静的 (構造的型付け) | 静的 (名前的 / interface のみ構造的) |
| 実行環境 | JVM | Node.js / Deno / Bun / ブラウザー | ネイティブバイナリ |
| 並行処理 | Virtual Threads | async/await | goroutine |
| 起動速度 | 遅い (JVM 起動) | 速い | 速い |
| エコシステム | Maven Central | npm | Go Modules |
| 用途 | エンタープライズ、Android | Web アプリ | CLI、サーバー |
Lambda での Java
Java の Lambda はコールドスタートが遅い (JVM の起動、クラスロード、フレームワークの初期化が積み上がって数秒に達する) のが課題である。SnapStart は初期化済みの実行環境のスナップショットを取っておき、そこから復元することでこの時間を縮める。
public class Handler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
return new APIGatewayProxyResponseEvent()
.withStatusCode(200)
.withBody("{\"message\": \"Hello\"}");
}
}
SnapStart には制約が 3 点ある。発行済みのバージョン (とそれを指すエイリアス) でしか使えず $LATEST では有効にできない。プロビジョニング済み同時実行とは併用できない。そして 1 つのスナップショットが多数の実行環境の初期状態になるため、初期化フェーズで張った接続や、ID / シークレット / 擬似乱数の種といった一意であるべき値は、復元後にハンドラー側で張り直す/作り直す必要がある。ここを見落とすと、複数インスタンスが同じ乱数列を返すといった再現しにくい不具合になる。
Spring Boot
Java のエンタープライズ開発で最も使われるフレームワーク。DI (依存性注入)、Web MVC、データアクセスを統合する。
GraalVM Native Image
GraalVM でネイティブバイナリにコンパイルすると、JVM の起動とクラスロードが実行時から消えるため、起動時間は数十ミリ秒の水準まで落ちる。
ただし代償がある。リフレクション、動的プロキシ、リソースの動的読み込みは事前に設定へ列挙しておく必要があり、漏れたクラスはコンパイルは通るのに実行時に落ちる。ビルドも通常の JVM 向けより桁違いに時間がかかる。加えて JIT による実行時最適化が効かないため、長時間動かし続けるサービスではピーク時のスループットが JVM 実行に劣る場合がある。起動の速さを最優先する用途で選ぶ手段であり、無条件の上位互換ではない。
Java を扱う関連書籍も多い。
この記事は役に立ちましたか?
関連用語
TypeScript
JavaScript に型を書く手段を足した言語。構造的型付け、型が実行時に残らない仕組み、消せない構文と型定義ファイルの扱いを解説
Go
Google が開発したシンプルで高速なコンパイル言語で、goroutine による軽量な並行処理が特徴
Rust
メモリ安全性とパフォーマンスを両立する、GC なしのシステムプログラミング言語
JIT コンパイル
プログラムの実行時にコードをネイティブコードにコンパイルし、パフォーマンスを向上させる技術
SpringBoot
Java の定番フレームワーク Spring を、設定を簡素化して手早く使えるようにした基盤
Laravel
PHP 製の人気 Web フレームワーク。優雅な記述と豊富な機能で開発を効率化する
関連する記事
Web 開発本ガイド - フロントエンドからバックエンドまで
Web 開発の全体像を学べる技術書の選び方と学習マップを紹介。フレームワーク本の賞味期限問題と公式ドキュメントとの使い分けも解説します。
JavaScript / TypeScript 本ガイド - 入門から型で守る実務コードまで
JavaScript と TypeScript を 1 本の学習ルートとして捉えた技術書の選び方。JavaScript の入門書、言語の背骨を通す体系書、TypeScript の型システムを設計の武器にする本、React/Next.js の実践書まで 2026 年 8 月時点の定番で案内します。
インフラ / クラウド本ガイド - AWS や Docker を本で学ぶ
クラウドインフラ、コンテナ、IaC を学べる技術書の選び方と学習順序を紹介。インフラ本の賞味期限問題と公式ドキュメントとの使い分けも解説します。