タグ
#Java
10 記事
-
Java バージョン進化史|Java 8 から 25 までの LTS と言語機能の歩み
Java 8 のラムダと Stream から、Java 25 の virtual threads・stream gatherers・compact object headers まで。Java 8・11・17・21・25 の 5 つの LTS について、リリース時期、言語機能、各 OpenJDK ディストリビューションの無償サポート期限を整理し、2026 年 3 月に GA したばかりの非 LTS の Java 26 が何をもたらすかも合わせて紹介します。まだ Java 8 / 11 を使っていてアップグレードを検討している開発者向けの対照マップです。
-
Java switch の進化史|Java 7 から Java 26 まで
Java の switch キーワードはバージョンごとに静かに進化してきました。Java 7 の String case、Java 14 で正式機能になった switch 式と yield、Java 21 で正式機能に昇格したパターンマッチング(null case、when ガード、sealed 型の網羅性チェック含む)、そして Java 26 時点でもプレビュー中の Primitive Types in Patterns まで、歴代の switch の変遷をまとめます。
-
OpenJDK ディストリビューションの選び方|Temurin・Corretto・Zulu・GraalVM ほか主要 9 種の比較
Java をダウンロードしようとすると OracleJDK、OpenJDK、Eclipse Temurin、Amazon Corretto、Azul Zulu、Microsoft Build of OpenJDK、IBM Semeru、Oracle GraalVM、BellSoft Liberica と選択肢が多すぎて迷います。同じ "JDK" でもライセンス、メンテナー、プラットフォーム対応はすべて異なります。本記事では Java 8 から Java 25 までの Oracle ライセンス変遷(2023 年の従業員数ベース課金を含む)を整理したうえで、主要な 9 種類のディストリビューションを用途別に比較します。
-
Java の Arrays.asList() と List.of() の違い|可変性・内部実装・使い分け
Java で 1 行で List を作る方法は 2 つあります — Java 1.2 からある Arrays.asList() と、Java 9 で追加された List.of() です。一見同じように見えますが、返ってくる List の実装クラスと可変性ルールはまったく別物です。本記事では両者の違い、内部でどう実装されているか、そしてどちらを選ぶべきかを解説します。
-
Content-Disposition で Unicode ファイル名を扱う方法|Java / Spring の IllegalArgumentException 対策
ダウンロード API で IllegalArgumentException が発生し、「code point が 0〜255 の範囲外」と怒られる場合、原因は ISO-8859-1 です。HTTP Header は生の UTF-8 を受け付けないため、Content-Disposition ではファイル名をパーセントエンコードして filename* パラメータで渡す必要があります。本記事では Java / Spring での最小限の修正方法を紹介します。
-
Java 8 日付・時刻 API 入門|LocalDateTime / Instant / Duration 実用サンプル集
Java 8 以前は Unix タイムスタンプを long で保持したり、java.util.Date に頭を悩ませたりしていました。Java 8 で導入された java.time パッケージは、イミュータブルでタイムゾーン対応の日付・時刻・期間を扱える、すっきりした API です。本記事では主要クラスの概要と、実際に使う操作のサンプルコードをまとめて紹介します。
-
Java で拡張子と MIME タイプを取得する方法|Files.probeContentType / Path.of 対応
Apache Commons や Guava を入れなくても、Java の標準ライブラリだけでファイル名から拡張子と MIME タイプは取得できます。Java 7 の NIO(Files.probeContentType)と Java 8 の Optional / Stream API を組み合わせれば、短く null 安全に書けて、そのままコピペで使えるユーティリティクラスに仕立てられます。Paths.get と Path.of の違い、そして Files.probeContentType の OS 依存な挙動も合わせて整理します。
-
Spring Data JPA / Hibernate の "failed to lazily initialize a collection" 解決方法|@Transactional と FetchType
Hibernate の LazyInitializationException("failed to lazily initialize a collection")は、セッションが閉じたあとで外部キーのコレクションを読みに行ったときに発生する典型的な落とし穴です。本記事ではこの例外が起きる仕組み(fetch type、セッションのライフサイクル、プロキシの罠)を解説し、推奨される `@Transactional` での修正と `FetchType.EAGER` という代替案を紹介します。
-
Java 17 sealed クラス完全解説|sealed・non-sealed・final の違いと permits の使い方
Java 17 で sealed クラスとインターフェースが正式機能に昇格しました(Java 15 からプレビュー機能として導入)。本記事では sealed・non-sealed・permits・final の組み合わせで「誰が継承できるか」を精密に制御できる仕組みを解説し、Animal → Chordata → Bird → Parrot / Penguin の動物クラス階層を通じて各パターンの使い方を順を追って示します。