Java 9のその先へ~JavaOne Conference 2017レポート

第3回 Java 9のモジュール機能で何が変わるのか[JavaOne2017]

この記事を読むのに必要な時間:およそ 4 分

モジュールでSPIを使用する

Java 9では,SPI(Service Provider Interface)の仕組みにもモジュールを適用することができます。SPIは,APIとしてはインタフェースのみが定義され,それに対して第三者が実装を提供できるようにするための仕組みです。ネットワーク関連APIやJDBCなど,標準APIだけでは実装方法が確定しないような場面で幅広く活用されています。

このSPIにモジュールを適用する場合,module-info.javaにはどのように依存関係を記述すればいいのでしょうか。ここでは,同じくAlex Buckley氏によるセッション「Modules and Services」で解説された内容を紹介します。

Alex Buckley氏

Alex Buckley氏

例として挙げられたのは次図のようなケースです。

サービスの関係

サービスの関係

サービスインタフェースとしてPrinterServiceLookupがあり,printlibモジュールのFastPrintクラスがその実装を提供します。一方でjava.desktopモジュールのPrinterクラスは,PrinterServiceLookupを利用する側のクラスです。

このとき,提供側となるprintlibモジュールでは,モジュール定義の中でprovides節を使ってPrintServiceLookupの実装を提供することを宣言します。provides節ではwithを使って実装クラスを指定します。一方利用側のとなるjava.desktopモジュールでは,uses節でPrinterServiceLookupを利用することを宣言します。このほかに,モジュール間の依存関係や公開範囲(requires/exports)の設定も必要です。

usesとprovidesを使ってサービスの利用側/提供側の宣言をする

usesとprovidesを使ってサービスの利用側/提供側の宣言をする

このように宣言することで,利用側はSPIで提供されるサービスローダの仕組みを経由してPrintServiceLookupの実装であるFastPrintクラスを利用できるようになるとのことです。次の図は,サービスローダ経由で実装クラスを取得するコードの例です。

サービス利用側のコード例

サービス利用側のコード例

従来のSPIでは,/META-INF/services/以下にインタフェースの実装クラスの情報を記述しておく必要がありましたが,モジュール定義情報がある場合はこれが不要になります。ただし,互換性のために残しておくこともできるとのことです。

Jigsaw breaks "some" things.

このように,Java 9への移行はモジュール化への対応とセットで考える必要があります。そのためにはモジュール機能に関する知識を得るのと同時に,これまでと何が異なるっているのかもよく把握しておかなければなりません。

Java 9への移行について,Mark Reinhold氏はキーノートで次のようにまとめています。

Jigsawは既存のアプリケーションの多くのものを壊すことがありませんが,多少の影響は与えます。もしあなたのコードがJava SE 8の標準APIのみを使っている場合には,ほぼ修正することなくJDK 9でも動作するでしょう。しかし,もしJDKの内部クラスに依存しているような場合には,修正が必要になるかもしれません

"Jigsaw breaks some things."

Jigsaw breaks some things.

Java 9のモジュールが実際の現場に浸透するまでにはまだしばらく時間がかかると思われます。とはいえ,何度も書いているようにこれは既存アプリケーションが動かなくなる可能性もある大きな変更です。できるだけ早く対応を進める必要があるでしょう。

JavaOne 2017
https://www.oracle.com/javaone/

著者プロフィール

杉山貴章(すぎやまたかあき)

有限会社オングス所属。Javaやシェルスクリプトによるソフトウェア開発を手がけるかたわら,プログラミング関連書籍やIT系雑誌記事,ニュース記事などの執筆などを行っている。著書に『正規表現書き方ドリル』(2010年,技術評論社),『図解クラウド 仕事で使える基本の知識』(2011年,技術評論社)などがある。

コメント

コメントの記入