Java SE 8オーバービュー──言語仕様、コア・ライブラリ、プラットフォームはどう変わったのか?

Oracle Java & Developers編集部
2014-06-11 16:00:00
  • このエントリーをはてなブックマークに追加

2014年3月に正式リリースされたJava SE 8には、非常に広範囲かつ多数の変更が盛り込まれている。その主なポイントはどこか? Javaテクノロジー・エバンジェリストのサイモン・リッター氏が語った。

 2014年3月にリリースされた「Java SE 8」は、Javaの歴史上、大きな変更が加えられたバージョンとして記憶されることだろう。2014年5月に東京で開催された「Java Day Tokyo 2014」では、米国オラクルでJavaテクノロジー・エバンジェリストを務めるサイモン・リッター氏が、Java SE 8の概要を説明した。リッター氏のセッション「Java SE 8 概要」の内容を基に、主な変更点を紹介する。

Javaの仕様策定プロセスをOpenJDKコミュニティに開放

米国オラクル Javaプロダクト・マネジメント、Javaテクノロジー・エバンジェリストのサイモン・リッター氏
米国オラクル Javaプロダクト・マネジメント、Javaテクノロジー・エバンジェリストのサイモン・リッター氏

 ご存じのとおり、Javaのコア・プラットフォームに対する仕様変更は、コミュニティ・プロセス「JCP(Java Community Process)」を通じて行われている。「JSR(Java Specification Request:Java仕様要求)」として提案された機能を専門家チームが協議して仕様を定めていくというスタイルをとっているのだ。Java SE 8に何を取り入れるかは「JSR 337」として検討され、そこに含まれる個別の機能も、それぞれのJSRとして提案されて仕様が策定された。

【Java SE 8(JSR 337)の主な変更点】

新たに追加された機能
  • JSR 308: Annotations on types
  • JSR 310: Date and Time API
  • JSR 335: Lambda expressions
変更された機能
  • JSR 114: JDBC Rowsets
  • JSR 160: JMX Remote API
  • JSR 199: Java Compiler API
  • JSR 173: Streaming API for XML
  • JSR 206: Java API for XML Processing
  • JSR 221: JDBC 4.0
  • JSR 269: Pluggable Annotation-Processing API

 Java SE 8には非常に多くの変更が盛り込まれているが、まず最初に知っていただきたいのは、その変更がどのように行われたかということだ。実はJava SE 8では、新しいやり方でアイデアを提供できるようにした。Java SEはプラットフォームの仕様だが、その開発キットである「JDK(Java Development Kit)」には、Java SEで規定されていないツールも含まれている。例えば、コンパイラはその1つだ。こうしたJava SEで規定されていないツールに対する提案を取り入れるために、「JEP(JDK Enhancement Proposal)」という仕組みを新たに設けている。

 JEPはOpenJDKのコミュニティに開放されており、実際には、JDKのあらゆる部分について提案することができる。言語、ライブラリ、JVM、コンパイラ、その他のツールなど、さまざまなことに関するアイデアをJEPとして提案可能なのだ。その提案がコア・プラットフォームに影響するものであったり、Java言語仕様やコア・ライブラリに関するものであったりした場合には、JCPで協議されることになる。そして、コア・プラットフォームに影響しない提案は、そのままOpenJDKコミュニティで協議される。このような過程を経て誕生したのがJava SE 8なのである。

言語仕様はどう変わったのか?

 Java SE 8では、言語仕様の変更がいくつか行われた。それらのうち、主なものを見ていこう。

新たなシンタックス「ラムダ式」

 Java SE 8における言語仕様の変更で最大のものは、新たなシンタックスとして「ラムダ式」を導入したことである。ラムダ式は匿名クラスを置き換えるもので、これを使うとクラスを定義せずにインスタンス作ることが可能になる。実際にはライブラリ・コードがクラスを生成するが、そうした面倒な作業はコンパイラがやってくれる。

 ラムダ式はインタフェースのメソッドを表すものと考えることができる。矢印(->)の左側がパラメータで、右側がそのボディだ。その特徴は、値だけでなく、振る舞い(Behavior)もパラメータとして渡せることである。次に示すのは、従来のコードをラムダ式で書き換えたものだが、ラムダ式を使うと、匿名クラスを使うよりもはるかにシンプルにコードを書けることがわかるだろう。

【匿名クラスをラムダ式で書き直した例】

従来の書き方
doSomething(new DoStuff() { public boolean isGood(int value) { return value == 42; } });
上記のコードをラムダ式で書き換えた例
doSomething(answer -> answer == 42);

インタフェースへのデフォルト・メソッドの導入

 シンタックスに関するもう1つの大きな変更点は、「インタフェースへのデフォルト・メソッドの導入」だ。新しいメソッドを追加するだけで、既存のインタフェースを拡張することが可能となったのだ。呼び出されたメソッドがクラスにないとき、コンパイラはインタフェースのデフォルト・メソッドを展開してメソッドを生成する。次に示すのは、インタフェースにデフォルト・メソッドを定義したコードの例である。

【デフォルト・メソッドの定義の例】

public interface Set extends Collection { public int size(); ... // The rest of the existing Set methods public T reduce(Reducer r) default Collections.setReducer; }

 この仕様変更は、Javaに「振る舞いの多重継承」をもたらす。これまでの「型の多重継承」に加えて、振る舞いも多重継承が可能になったわけだ。ただし、「状態(State)の多重継承」は現在もJavaには存在しない。C++では状態を多重継承できるが、これは開発者を悩ませるさまざまな問題を引き起こしている。

タイプ・アノテーション(アノテーションの拡張)

 言語仕様の変更には、「タイプ・アノテーションへの対応」もある。アノテーションは、Java SE 5で導入された機能で、近年のJava EEでよく使われる依存性の注入(DI:Dependency Injection)もアノテーションを利用した機能だ。

 アノテーションが使える場所は、これまで宣言部分に限られていたが、Java SE 8ではこれを拡張し、型を定義している場所ならどこでも使えるようにした。型チェックはコンパイル時に行われるため、プログラム実行時にエラーが発生するのを回避できる。これにより、テストに使われる労力を減らすことが可能になるだろう。