1.3 Javaのエディションとバージョン（Java SE、Jakarta EE、リリースモデル、LTSなど）～Java Basic編

### はじめに

#### 自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。
様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。
* [「マスタリング Java EE 5」（2007年）](https://amzn.asia/d/j0txqK5)
* [「アプリケーションアーキテクチャ設計パターン」（2017年）](https://amzn.asia/d/9avaCyF)

いずれも**Java EE**（**Jakarta EE**）を中心にした企業システム開発のための書籍です。中でも [「アプリケーションアーキテクチャ設計パターン」](https://amzn.asia/d/9avaCyF)は、（Javaに限定されない）比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです（中級者向け）。

#### Udemy講座のご紹介

この記事の内容は、私が講師を務めるUdemy講座『**Java Basic編**』の一部の範囲をカバーしたものです。『**Java Basic編**』はこちらの[**リンク**](https://www.udemy.com/course/learn-java-se-basic/?referralCode=594C958456356851C97C)から購入できます（セールス対象外のためいつも同じ価格）。また**定価の約30%OFFで購入可能なクーポン**をQiita内で定期的に発行していますので、興味のある方は、ぜひ私の他の記事をチェックしてみてください。

この講座は、以下のような皆様にお薦めします。
* Javaの言語仕様や文法を正しく理解すると同時に、現場での実践的なスキル習得を目指している方
* 新卒でIT企業に入社、またはIT部門に配属になった、新米システムエンジニアの方
* 長年IT部門で活躍されてきた中堅層の方で、学び直し（リスキル）に挑戦しようとしている方
* 今後、フリーランスエンジニアとしてのキャリアを検討している方
* 「**Chat GPT**」のエンジニアリングへの活用に興味のある方
* 「**Oracle認定Javaプログラマ**」の資格取得を目指している方
* IT企業やIT部門の教育研修部門において、新人研修やリスキルのためのオンライン教材をお探しの方

#### この記事を含むシリーズ全体像

この記事はJava SEの一部の機能・仕様を取り上げたものですが、一連のシリーズになっており、**シリーズ全体でJava SEを網羅**しています。また認定資格である「**Oracle認定Javaプログラマ**」（Silver、Gold）の範囲もカバーしています。シリーズの全体像および「Oracle認定Javaプログラマ」の範囲との対応関係については、以下を参照ください。

https://qiita.com/KenyaSaitoh/items/4711a078a851510bc4da

## 1.3 Javaのエディションとバージョン

### チャプターの概要

このチャプターでは、Javaの3つのエディションや、Javaがバージョンアップのたびにどのような機能を追加してきたのかについて学びます。

### 1.3.1 Javaのエディション

Javaには、用途や利用目的に応じて、3つの標準的なエディションがあります。それぞれのエディションでは、クラスライブラリ（API）と、その目的に応じた開発および実行環境が提供されます。

##### Java SE（Java Platform, Standard Edition）
Java SEとは、Javaプログラムを開発・実行するための環境と、Javaの最も基本となるクラスライブラリを提供するエディションです。
クラスライブラリとしては、文字列を表すjava.lang.Stringクラスや、数値を表すjava.lang.Integerクラスなど、言語本体とも言うべき機能が含まれています。

##### Java EE（Java Platform, Enterprise Edition）
Java EEとは、企業システム向けのJavaアプリケーションを実行するための環境と、それらを開発するためのクラスライブラリを提供するエディションです。
なおJava EEは、もともとはOracle社が権利を有していましたが、2017年にオープンソース化され、「Jakarta EE」と名称が変更になったため、現在では「Java EE」という呼び方は使われなくなっています。

##### Java ME（Java Platform, Mobile Edition）
Java MEとは、モバイル端末向けのJavaアプリケーションを実行するための環境と、それらを開発するためのクラスライブラリを提供するエディションです。
なおJava MEは、リソースに制約のあるモバイル端末のための最小構成のエディションでしたが、昨今ではモバイル端末の性能向上により、Java SEが問題なく動作するようになったため、Java MEは使われなくなりました。

:::note info
このように現在残存しているエディションはJava SEのみのため、単にJavaという言い方をした場合、Java SEを指すと考えて問題ありません。本コースで取り上げるクラスライブラリも、すべてJava SEの中に含まれるものになります。
:::

### 1.3.2 Javaのリリースモデル

Java（＝Java SE）は初期バージョンは1995年に発表されていますが、その後バージョンアップを重ね、2022年6月時点の最新バージョンはJava 18です。
ここでは、Javaがどのようなリリースモデルを採用しているのかを説明します。

#### Javaのリリースモデル

Javaのリリースモデルは当初、次期バージョンに取り込むべき機能をまず決めて、その機能の開発が終わり次第リリースする、というものでした。ただしこのモデルでは、新機能の開発に想定以上の期間を要してしまった場合、必然的に次期バージョンのリリースが遅れてしまい、Javaという技術全体の進化までも停滞しがちになる、という結果を招いていました。
そこで2017年9月にリリースされたJava 9からは、まずリリースの時期を決め、そこに含めることができる機能のみを次期バージョンに取り込む、というリリースモデルに変更されました。このモデルではリリースサイクルが半年となったため、Java 9以降、バージョン番号のカウントアップが急に速まったように感じることでしょう。
ただし半年ごとにリリースされるすべてのバージョンをメンテナンスすることは困難なため、3年ごと、すなわち6バージョンごとにリリースされるバージョンを、LTS（Long Term Support）と設定し、長期サポートの対象としています。企業システムでの利用など、長期のサポートが求められる場合は、LTSを選択することになるでしょう。

#### Javaのバージョンとリリース日

Javaのバージョンとリリース日、そしてLTS対象については、以下の表のようになっています。

【表1-3-1】Javaのバージョン・リリース日・LTS対象
|バージョン|リリース日|LTS対象かどうか|
|--|--|--|
|Java 8|2014年3月|対象|
|Java 9|2017年9月||
|Java 10|2018年3月||
|Java 11|2018年9月|対象|
|Java 12|2019年3月||
|Java 13|2019年9月||
|Java 14|2020年3月||
|Java 15|2020年9月||
|Java 16|2021年3月||
|Java 17|2021年9月|対象|

:::note info
2022年6月現在、LTSの対象となっているのは、Java 8、11、そして17です。
:::

#### 1.3.3 Javaのバージョンと主要な機能

ここではJava 5以降のバージョンアップにおいて、どのような機能が追加されてきたのか、主要な機能に絞って整理します。
なおここに出てくる各機能については、後続のチャプターや「レッツラーンシリーズ」の別コースにて詳細を説明しますので、この時点では内容を把握する必要はありません。

##### Java 5

•	拡張for文
•	オートボクシング
•	staticインポート
•	可変長パラメータ
•	総称型
•	列挙型
•	アノテーション

##### Java 7

•	数値セパレーター
•	switch文の文字列対応
•	マルチキャッチ
•	リソースの自動クローズ
•	Java NIO.2（java.nio.file API）

##### Java 8

•	インタフェースにおけるデフォルトメソッドとスタティックメソッド
•	関数型インタフェース
•	ラムダ式
•	メソッド参照
•	ストリームAPI
•	Date and Time API
•	Optionalクラス

##### Java 9

•	モジュールシステム
•	jshell

##### Java 10

•	ローカル変数の型推論（varキーワード）

##### Java 11

•	HTTPクライアントAPI

##### Java 12

•	switch文の拡張（case句に複数値を記述可能に）

##### Java 14

•	switch式（値を返すswitch文）

##### Java 15

•	テキストブロック

##### Java 16

•	レコードクラス
•	instanceofのパターン・マッチング

#### 本コースが前提とするバージョン

本コースでは、2022年6月時点における最新のLTSであるJava 17を前提とした解説を行っていきます。ただしJava 17はリリースからの日も浅く、世の中ではまだまだJava 8やJava 11が現役で利用されています。そのため、Java 9以降のバージョンで追加された機能を説明する際は、どのバージョンで追加された機能なのかを明示するようにしています。
適宜、受講生の皆さんが利用する想定のバージョンと比較をしながら、コースを進めてください。

:::note info
Java 9以降に追加された機能はバージョンを明記していますので、適宜、受講生の皆さんが利用するバージョンとの比較をお願いします。
:::

### 1.3.4 Java SEクラスライブラリの全体像

#### Java SEクラスライブラリの主要なモジュールとパッケージ

ここでは、Java SEのクラスライブラリにおける主要なモジュールとパッケージを、まとめて紹介します。なおモジュールについては『Java Advanced編』で、パッケージについてはチャプター9.1で詳細を説明しますが、ここではいったんクラスを分類するためのグループと理解しておけば問題ありません。

【表1-3-2】Java SEクラスライブラリの主要なモジュールとパッケージ
|モジュール|パッケージ|説明|本シリーズにおける主な参照先|
|--|--|--|--|
|java.base|java.lang|Java言語として最も基本的な機能を提供するクラス|シリーズ全体で使用|
||java.util|コレクションフレームワークを初めとした様々なユーティリティクラス|『Java Basic編』チャプター19.1～19.2|
||java.util.regex|正規表現のためのクラス|『Java Basic編』チャプター16.2|
||java.text|数値や日時をフォーマッティングしたり解析したりするためのクラス|『Java Basic編』チャプター17.1、20.1|
||java.time|Date and Time APIにおいて、日付と時間などを表すクラス|『Java Basic編』チャプター20.2|
||java.time.temporal|Date and Time APIにおいて、日付や時間の単位表現や計算を行うクラス|『Java Basic編』チャプター20.2|
||java.time.format|Date and Time APIにおいて、日付と時間をフォーマッティングしたり解析したりするクラス|『Java Basic編』チャプター20.2|
||java.util.concurrent|並行処理ユーティリティ（Concurrency Utilities）でサポートされたクラス|『Java Advanced編』チャプター3.2～3.3|
||java.util.concurrent.locks|ロックの機能を提供するクラス|『Java Advanced編』チャプター3.1|
||java.util.concurrent.atomic|アトミックを保証クラス|『Java Advanced編』チャプター3.3|
||java.util.function|関数型インタフェース（ラムダ式やメソッド参照で実装）|『Java Advanced編』チャプター4.1|
||java.util.stream|StreamクラスなどストリームAPIの主要なクラス|『Java Advanced編』チャプター4.2|
||java.io|ファイル、データ、直列化など入出力のためのクラス|『Java Advanced編』チャプター5.1、5.2|
||java.net|ネットワーク通信のための基本的なクラス|『Java Advanced編』チャプター6.1|
||java.nio|Java NIO全体で使用するクラス|『Java Advanced編』チャプター5.1、6.1|
||java.nio.file|Java NIO.2において、ファイルを操作するためのクラス|『Java Advanced編』チャプター5.1|
||java.nio.channels|Java NIOにおいて、チャネルを表すためのクラス|『Java Advanced編』チャプター6.1|
||java.nio.charset|Java NIOにおいて、文字コードを表すためのクラス|『Java Advanced編』チャプター6.1|
||java.lang.reflect|リフレクションのためのクラス|『Java Advanced編』チャプター8.2|
||java.lang.annotation|アノテーションの機能を提供するためのクラス|『Java Advanced編』チャプター8.3|
|java.net.http|java.net.http|HTTPクライアントAPIでサポートされた、HTTP通信用のクラス|『Java Advanced編』チャプター6.2|
|java.sql|java.sql|データベースアクセス（JDBC）のためのクラス|『Java Practical編』予定|
|java.xml|org.w3c.dom|Document Object Model（DOM）のインタフェース|『Java Practical編』予定|
||javax.xml.parsers|DOMを使用してXML文書を処理するためのクラス|『Java Practical編』予定|
||javax.xml.stream|Streaming API for XML（StAX）のインタフェースとクラス|『Java Practical編』予定|
||javax.xml.stream.events|Streaming API for XML（StAX）のイベントを表すインタフェース|『Java Practical編』予定|
||javax.xml.xpath|XPath式のためのAPIを提供するクラス|『Java Practical編』予定|

このようにJava SEのクラスライブラリをモジュールおよびパッケージという観点で俯瞰すると、歴史的な経緯もあり、パッケージの粒度にはばらつきがあることに気が付きます。例えばjava.utilパッケージは、コレクションフレームワークが包含されているのを初め、壮大なパッケージになっています。それに対してJava NIOでサポートされたクラスは、機能ごとにパッケージが細分化されています。
要は、パッケージのラインアップ数と提供される機能の大きさとは必ずしも比例するわけではない、と理解した方が良いでしょう。

### このチャプターで学んだこと

このチャプターでは、以下のことを学びました。

1. Javaには、Java SE、Java EE（Jakarta EE）、Java MEという3つのエディションがあること。
1. JavaのリリースモデルとLTSの考え方について。
1. Java 5以降、どのような機能が追加されてきたのか。
1. Java SEクラスライブラリの全体像について。