Javaプラットフォームの次期バージョンであるJava SE 7は、2008年後半のリリースを目指して現在仕様の策定が進められている。カリフォルニア州サンフランシスコにて8日(現地時間)より開催されている2007 JavaOne Conferenceにおいても、Java SE 7に関連したセッションやBOF(Birds Of a Feather)が多数行われている。本レポートではその中から、モジュラリティサポートについてのテクニカルセッションの様子をお伝えする。

Java SE 7におけるモジュラリティのサポートは、開発時とデプロイメント時の双方からそれぞれ検討されている。そのうち、開発時のモジュラリティについては"Superpackage"という新しい概念によって実現される予定で、JSR 294として仕様の策定が行われている。JavaOneでは「Java Language Modularity With Superpackage」と題するセッションにおいて、スペックリードであるAlex Buckley、Andreas Sterbenz両氏より、このSuperpackageの概要や提供される機能などが紹介された。

まずBuckley氏は、プログラムモジュールの要件として次のような項目を挙げた。

  • 実装に依存しないインタフェース
  • 良質なイディオムを採り入れるプロトコル
  • 確実な情報の隠蔽
  • 明確な効果

そのほかにも、バージョン管理やリソースの宣言、集中的な例外処理なども「良いモジュール」の条件であると指摘する。

中でも今回最も問題としているのが情報の隠蔽だ。従来のJavaプログラムの場合、パッケージによるアクセス制御を利用して情報隠蔽を実現するのが一般的である。しかし、パッケージだけではモジュール化機能としては不十分だと同氏は言う。たとえばパッケージ間の関係(名前で示すような階層構造)が明確でなく、情報を「隠蔽する」か「公開する」かの二者択一である。「サブパッケージだけに公開」といったことはできない。

パッケージ外部に対しては"public" か、そうでないかしか選択できない

そこでJSR 294で目指しているのが「スーパーパッケージ」という概念の導入である。エキスパートグループは、スーパーパッケージを具体的に次のようなものだと定義している。

  • パッケージや(他の)スーパーパッケージとそのタイプの集合
  • 明示的に"Export"されたメンバのみ外部からアクセスできる
  • "Export"されていないメンバは、同じスーパーパッケージ内の他のメンバからのみアクセスできる
  • Javaソースファイルによって定義し、Javaコンパイラによってコンパイルできる

Sterbenz氏はスーパーパッケージを定義する例としてリスト1のようなコードを示した。この場合、java.utilおよびjava.ioパッケージの情報には外部からアクセスできるが、sun.ioパッケージは隠蔽されることになる。

リスト1 super-package.java - スーパーパッケージの定義例

superpackage jdk {
    member package java.util;
    member package java.io;
    member package sun.io;   // 公開されないパッケージ

    // 公開されるパッケージ
    export java.util.*;
    export java.io.*;
}

スーパーパッケージを利用すればより細かなアクセスコントロールが可能になる

スーパーパッケージの定義はsuper-pakcage.javaにおいてのみ行えばよく、既存の.javaファイルを変更する必要はない。コンパイルした際に.spkgというスーパーパッケージの定義ファイルが生成されると同時に、.classファイルにもスーパーパッケージの情報が格納されるということだ。実行時にはJVMによって.spkgファイルが読み込まれ、パッケージのアクセシビリティが解釈される。

スーパーパッケージのメンバとしてスーパーパッケージを指定することもできるという。当然スーパーパッケージに対しても"Export"するかどうかを指定することができ、Exportした場合のみ外部に公開される。このようなネストされたスーパーパッケージはリスト2のようなコードで定義するとのことだ。

リスト2 ネストしたスーパーパッケージの定義例

superpackage foo {
    member superpackage foo.xml, foo.net;
    export superpackage foo.xml;
}

superpackage foo.xml member foo {
    member package foo.xml.dom, foo.xml.dom.util;
    export foo.xml.dom.Factory;
}

super-package.javaの配置場所や.spkgファイルのフォーマット、"superpackage"などの新しい予約語、スーパーパッケージ定義のためのアノテーションなど、細かな部分についてはこれから検討していくとのことである。