Java 7に追加されるJSRたち

前回はJava EEの今後の動向を紹介したので、今回はJava SEについて取り上げたい。Java 7(Java SE 7)については、この記事でJava SEチームのチーフエンジニアであるMark Reinhold氏による講演の内容を紹介している。まず最も気になるリリース時期だが、Reinhold氏によれば2010年の初めごろを予定しているとのことである。

以下では同氏の講演を含めてこれまでに明らかになっている情報を総合し、Java 7に取り込まれる新機能をまとめてみる。まず、すでにJSRを取得している仕様としては以下のものが挙げられる。

  • JSR 166: Concurrency Utilities
  • JSR 203: More New I/O APIs for the Java
  • JSR 225: XQuery API for Java
  • JSR 255: JMX 2.0
  • JSR 262: Web Services Connector for JMX
  • JSR 292: JVM Support for dynamic languages
  • Project Jigsaw(モジュラリティの強化)
  • JSR 296: Swing Application Framework
  • JSR 308: Annotations on Java Types

ほとんどが以前の記事でも取り上げているものだが、モジュラリティの強化についてだけは補足が必要だろう。当初、モジュラリティの強化としてはJSR 294とJSR 277の2 つのAPIが検討されていた。前者はSuperpackage、後者はJAM(Java Application Module)と書いた方がわかりやすいかもしれない。そして2008年の初めごろ、Sunは両者を統合して仕様を検討し直すと発表。事実上はJSR 277に一本化されることになった。しかしそのJSR 277は多くの問題について解決の糸口が見えないことから、Java 7への統合を見送ることが決まった。

一方OpenJDKコミュニティでは、JSR 294のエキスパートグループが中心となって、JSR 277よりも低いレイヤーにおけるモジュールシステムを構築する試みとして「Project Jigsaw」が新たに立ち上がっている。Project Jigsawの成果はJava 7に反映される予定だが、Reinhold氏によれば(リリースまでの時間が短いので)JSRとして正式に仕様化されるものではないとのことだ。

参考

JSR 166はJ2SE 5.0から導入された並列プログラミングのためのユーティリティだが、Java 7ではFork/JoinやPhasers、LinkedTransferQueue、ConcurrentReferenceHashMapなどの拡張機能が追加される予定。

JSR 292はJVM上で動作する動的言語の実装をサポートするための仕様である。その中心となるのがJVMに対するinvokedynamic命令の実装で、これによって動的に型が決まるメソッド呼び出しを容易に実現できるようになる。現在はEarly Draftが公開されており、invokedynamic命令の概要とそれを利用するためのAPIについて解説されている。また、JVM上の動的言語のためのアーキテクチャを作成する「The Da Vinci Machine Project」は、すでにOpenJDK上でinvokedynamic命令の動作に成功したことを発表している。

その他のAPIに関しては過去の記事を参照していただきたい。

参考

Java 7のその他の新機能

以下は、まだJSRを取得していないAPIや、既存APIに対する修正によって実現する予定の機能である。全てを挙げるとキリがないので、ここでは代表的なもののみピックアップしてみる。

  • 例外のマルチキャッチおよび安全な再スロー
  • "?"を使ったnullチェック
  • ジェネリクスにおける型推論の拡張
  • 新しいガベージコレクタ("Garbage-First"ガベージコレクタ)
  • Unicode 5.0のサポート
  • 新たなスクリプト言語エンジンの追加

例外のマルチキャッチとは、複数の種類の例外をひとつのcatchブロックで処理できるようにするもの。また安全な再スローとは、キャッチした例外をそのブロック内で再スローする場合にも、キャッチとスローの無限ループに陥らないようにする仕組みである。

"?"によるnullチェックとは、たとえば次のような記述でオブジェクトのnullチェックをできるようにするということらしい。これによってif文でのnullチェックを省略してプログラムをシンプルに書けるようになる。

リスト1

public String getPostcode(Person person) {  
       return person?.getAddress()?.getPostcode();  
}  

またジェネリクスを使う場合により高度な型推論が行われるようになり、たとえば次のような記述が可能になるという。

リスト2

Map<String, List<String>> anagrams = new HashMap<>();  

クロージャはどうした?

おそらく多くのJava開発者が興味を持っているであろうクロージャについてだが、どうやら採用はJava 7の次のバージョンに持ち越される可能性が濃厚になってきたようだ。以下はMark Reinhold氏が挙げているJava 7に"含まれない"であろう機能の一部である。

  • クロージャ
  • JSR 295: Beans Binding
  • BigDecimalのためのシンタックス
  • オペレータ・オーバーロード
  • 言語レベルでのプロパティ

ここにクロージャが含まれている理由は、現時点でまだ仕様が統一されていない上に、乗り越えるべき問題が多すぎるからだという。ただし依然としてクロージャを望む声も多く、またDevoxxの前週に開催されたSun Tech DaysではJames Gosling氏がクロージャを採用すべきだとの発言をしていることから、今後もまだ議論は継続しそうだ。

参考

JSR 295についても(プロパティサポートを含む)いくつかの問題が解決できないことから、議論は先のバージョンに持ち越されるとのこと。オペレータオーバーロードはC++のような無制限なものではなく、BigDecimalやコレクションを扱うための限定的な機能として提案されていたものだが、これも採用は見送られるようだ。

参考

これに加えて、前述のJSR 277やJSR 260 Javadoc Technology Update、言語レベルのXMLサポートなどといった機能も採用が見送られる予定。本連載ではほかに、JSR 303 Beans ValidationJSR 275: Units SpecificationJSR 310: Date and Time APIなどといったAPIもJava 7の新機能候補の一部として取り上げたことがあるが、これらについてはまだ確定的な情報は明らかになっていない。

正式リリースまで1年、引き続き動向をチェックしていきたい。

ご愛読ありがとうございました

さて、60回に渡って続けてきた本連載も今回で終了となります。長い間ご愛読いただき、誠にありがとうございました。連載そのものは終了しますが、Javaに関する新しい動きがあった際には、その都度何らかの形で紹介していけるよう努めてまいります。今後ともどうぞよろしくお願いいたします。