はじめに
2017年9月にJava 9がリリースされました。Javaという名前で初めて世の中に出てきたのは1995年なので、それから20年以上も経過したことになります。これまでJavaは、いろいろな技術のトレンドを作ってきました。
最近では、Java自体がITのトレンドとして扱われることも減りました。そのためか、なかなか細かい内容まで広く取り扱われることがなくなってきました。しかし、Javaが広く使われている言語の一つである事実に変わりはありません。
2000年からJavaを触っている筆者としては、Javaはサーバーサイドの言語である先入観がありますが、Android世代の技術者にとってはスマートフォンのための言語といった側面もあるでしょう。Javaという言語に期待する機能なども、それぞれの用途によって違うと思います。そのため、それぞれの機能やこれまでの機能についても、目的別に考慮して見る必要があります。
本連載ではJava 9がリリースされたこの機会に、これまでのJavaのリリースとトレンド、そしてJava 9の新機能を紹介します。今回は概要のみですが、次回以降Java 9で変わった具体的な内容について解説する予定です。
対象読者
- Javaに携わる開発者
- これからJavaを学ぼうと思っている方
これまでのJavaのリリースと技術のトレンド
Java 9のリリースについて紹介する前に、これまでのJavaのリリースについて、関連する時代の流れを踏まえ、図1に表しました。
Javaと密接な関係がある技術キーワードやブラウザの進化が分かるように、Internet Explorer(IE)のバージョン、そしてAndroidのバージョンの変遷も併せて記しました。
2000年ごろからWebシステムは本格的に使われ始めました。2007年に入りクラウドがトレンドになるまで、この時期はクライアントサーバーシステムからWebシステムへの転換期でした。そのため、サーバーサイドの技術に対しても大きな注目と需要があり、多くの開発者にとってJavaはサーバーサイドのための言語といえる状況でした。
ただしその後、Webシステムが広く使われ始めると、既存のクライアントアプリケーションに似た操作性が望まれるようになり、「RIA(Rich Internet Application)」というキーワードが出てきました。例えば、マイクロソフトの「Silverlight」やアドビの「Flash」などです。そして、アドビではさらにFlashの技術を使ってアプリが作れる「AIR」もリリースしました。HTMLとJavaScriptだけでは実現が難しい仕組みをRIA技術で補っていたわけです。この時期、Javaも「JavaFX」をリリースしています。
その後、RIA普及の流れは止まってしまいましたが、現在のWebアプリには多大な影響を及ぼしています。
その後もJavaは、ビックデータを扱うためにHadoopで採用されるなど、クライアント側よりも中央集権型のシステムとして順調に成長していくことになります。
その間に、サン・マイクロシステムズ社がオラクル社に買収されたことや、Androidにおけるオラクルとグーグルの間の問題が発生したこともあり、クライアント向けの開発言語として最適化されないまま時が経過しました。一方で、クライアント技術はネイティブアプリだけではなく、Webブラウザが急速に進化したことによって、JavaScriptを使った多機能なWebアプリが普及していきました。つまり、リッチなクライアントが当たり前の時代になったのです。
こうした背景を元に、Javaもこれまでの中央主権型サービスへの最適化から、リッチなWebアプリといったクライアント側への対応、さらにIoTなどの小さなサービスに適した性質が望まれてきています。Java 9はまさに、この声に応えるべくリリースされたバージョンともいえます。
この流れを踏まえ、これまでのJavaのリリースについて改めて振り返ってみましょう。
J2SE 5.0のリリース内容
J2SE 5.0では以下の内容がリリースされました。現在のJavaの骨格がこのリリースで固まったといえるのではないかと思います。
- ジェネリクス
- アノテーション
- JMX
- enum型/拡張for文/可変長引数/オートボクシング
これらの機能を使わないJavaプログラミングは、すでに不可能といっても過言ではありません。そのため、現在普及しているライブラリはこれらの機能を前提にしたものがほとんどで、最低でもJ2SE 5.0以上のバージョンが必須となっているでしょう。
Java 6のリリース内容
バージョンが分かりにくいことから表記方法が変わりました。J2SE 1.5と比較するとそれほど大きな変更はありません。デスクトップ関連API以外では通常のプログラミングに直接的な影響を及ぼす内容は少なく、成熟度を上げてきた印象があります。
- デスクトップ関連APIの改善
- スクリプトの実行
- コンパイルAPI
- XMLのサポート強化(JAXB、JAX-WS)
- 自作MXBeanのサポート
スクリプトの実行ができるAPIも提供されました。実際にJDKで実行できるのはJavaScriptのみですが、他の言語も実行できるようにAPIが定義されています。
また、リリース内容とは直接関係がありませんが、以前よりJavaVMはJRubyやScalaの実行環境として認知されつつあり、言語と実行環境が区別され始めたのもこの頃でした。
コンパイルAPIではJavaコードをコンパイルするためのAPIが提供され、例えばJSPエンジンの実装しているミドルウェアなどに大きな影響を与えました。さらに、XML関連の技術の標準化もされつつあります。管理面ではMXBeanというアプリケーション内部のリソースや負荷などを把握する為の監視ポイントを自分で作成できるようになっています。
これまで、各ミドルウェアなどが独自の仕様で提供していた機能などが標準機能として取り込まれたのも、このようなAPIが公開されたのも、まさしくJavaが運用面まで重要視された環境であったことを示しています。
Java 7のリリース内容
これまでの流れを踏襲し、コーディングしやすいように機能改善されたリリースです。
- try-with-resources
- ジェネリクス(ダイヤモンド記法)
- 例外のマルチキャッチ
- switchで文字列指定可能
- JavaFXを標準で追加
Java 7は比較的小さなリリースです。Javaがかなり成熟してしまったこともあると思います。また、このリリース前にJavaの開発がサン・マイクロシステムズ社からオラクル社に移行したことも関係しているのかもしれません。
Java 8のリリース内容
ラムダ式が最も大きな変更です。ラムダ式、もしくはクロージャといった記述方法が使われるケースが増えてきたために、Javaでも同様に記述できることが望まれていました。
- ラムダ式(クロージャ)
- Stream API
- Optionalクラス(NullPointerExceptionの抑制等)
- インターフェースのデフォルトメソッド
- 新しいDate and Time API
- タイプ・アノテーション
Java 8は「いかにコーディングがしやすいか」ということを中心に考えたリリースであったといえます。特にラムダ式は、既存の無名クラスなどが必要な場合にコード量を少なくできます。こうした記述方法は主にイベント処理で使われることが多く、クライアントアプリケーションで使われるケースも増えてきていました。また、サーバーサイドでもイベントドリブン型の処理という概念が広まってきたことが、機能追加の背景にあったと思われます。
Stream APIでは、リストのようなコレクションに対して行っていたデータの加工、フィルタといった処理が、さらに分かりやすく記述できるようになりました。
ラムダ式やStream APIを使って記述をすると、例外処理などが記述しづらくなり、場合によってはわかりにくくなるケースもあります。しかし、例えばAndroidなどのクライアントアプリケーションのようにUIイベントに対する処理をたくさん記述するケースでは、そのたびに無名クラスを定義するのは煩雑です。また、プログラマ自身がデータの生成から処理まですべて把握可能な場合もあり、その場合、データの例外処理をある程度省略することが可能です。このようなケースではコードの見やすさがより重要視されます。
このように、利用シーンと目的に応じて記述方法が柔軟になった点においては、開発者にとってより扱いやすくなったといえるでしょう。
そして、Javaのリリース内容が「機能の追加」から「同様の機能がどう記述できるか」といった方向性に変わってきたことがうかがえます。
Java 9の主なリリース内容
Java 9は、当初の予定よりも約1年遅れてのリリースとなりました。その大きな原因として、「Project Jigsaw」と呼ばれるJavaをモジュール化する機能の追加がありました。この機能はJavaの骨格を変えてしまう程のインパクトがある変更です。Java 7のころから話は上がっていたものの、毎回延期されてきました。それがJava 9でついにリリースされました。それを含め、以下の点が変更されました。
大きな変更点
- モジュール機能(Project Jigsaw)
- JShell(Project Kulla)
- Reactive Streams(JEP 266)
細かい変更点
- Compact Strings(JEP 254:Compact Strings)
- コレクションの改善(JEP 269:Convenience Factory Methods for Collections)
- try-with-resources構文の追加(JEP 213:Milling Project Coin)
また、これ以外にも細かい変更点が多々あります。詳細は、オラクルから提供されているJava 9の変更点を参照してください。