この記事はSRA Advent Calendar 2017の1日目の記事です。
Java9のリリース内容
こんにちは! 関西事業部の佐々木です。
2017年9月、Java9がリリースされました。
Java8についてはLambda式やinterfaceのデフォルトメソッド、メソッド参照やOptionalの追加など、コーディングに大きく影響を与える内容のせいで注目が集まりました。
おかげでJavaの最新情報ををウォッチしていない人でも、Java8については新機能についてある程度知っている人が多いように思えます。
しかしJava9については、積極的に情報収集していない人はどんなリリースがされたかあまり認識していないようで、とりあえず時間のない人に向けて「これだけはおさえておけ」というJava9のリリース内容の一部をご紹介したいと思います。
ここでいう「これだけ」は私個人の判断なので、異論があるかもしれませんがその場合はコメントで補足していただけると嬉しいです。(他力本願)
jshell
REPLツールのjshellが使えるようになりました。
文末のセミコロンは省略できますし、Javaのコードを実行するためにわざわざクラスやメソッドを作る必要はありません。(もちろん、クラスもメソッドも作ることはできます)
また、上の例ではRandomオブジェクトを生成したあと「r.
」とタイプし、TABキーを押してメソッド補完を行っています。
さらにjshellでは「/(スラッシュ)」で始まるコマンドがたくさんあります。
以下はほんの一部です
- /list 入力した内容を表示
- /save ファイルに保存
- /open ファイルの内容を入力
- /! 最後の命令を再実行
Javadocの検索機能
Javadocで検索機能が使えるようになりました。
右上にある検索窓にキーワードを入力すると、パッケージ名やクラス名などのインクリメンタルサーチができます。
パッケージ名やクラス名なら、今までもブラウザの検索機能である程度できたと思いますが、メソッド名の検索もいきなりできます。
モジュールシステム
実はJava9の一番の目玉機能は「モジュールシステム」です。
モジュールシステムは深く理解しようとすると結構難解なのですが、ここでは最低限の内容に留めておきます。
まず、モジュールシステムの前に以下の2つの問題について簡単に説明します。
- JAR hell
- 見えすぎちゃって困るの問題
JAR hell
JAR hellとはJavaアプリケーションが多くのJARに依存しているせいで起こる問題です。
依存するJARが多すぎて管理できず実行時にClassNotFoundExceptionが発生したり、異なるバージョンの同じJARファイルがあるせいでエラーが起こったりすることです。
見えすぎちゃって困るの問題
この「見えすぎちゃって困るの問題」は私が勝手に命名したものですが、JavaではJARに含まれているクラスというのは「見る」ことができます。
クラスにはprivaite、publicなどのアクセス制御ができますが、他のパッケージからアクセスできるようにするにはpublicにする必要があり、その結果他のJARなどからもアクセスできるようになってしまいます。
また、パッケージにはクラスのようなアクセス制御ができませんでした。
module-info.java
上記のような問題を解決するのがモジュールシステムです。
モジュールシステムを利用するにはsrcのトップディレクトリに「module-info.java」というファイルを置きます。
src -- kazsharp.lambda_logging.jcl
| |
| -- LambdaLog4jLog.java
|
-- module-info.java
そしてmodule-info.javaには依存するモジュールや公開するパッケージなどを記述します
module <モジュール名> {
requires <依存するモジュール名>;
exports <公開するパッケージ名>;
}
従来どおり、自分のモジュール内ではexportsしていないパッケージでもアクセス可能ですが、他のモジュールはexportsされているパッケージにのみアクセスできます。
また、複数ののモジュールに同じパッケージがあるとエラーになります。
経過措置
モジュールシステムを知ると心配になるのが、Java9を使うと
- requiresを書かないと他のJARが使えないの?
- exportsを書かないと他のJARから使えないの?
ということですが「経過措置」という期間が設けられています。
経過措置には「無名モジュール」や「自動モジュール」というものがあり、module-info.javaを配置していなくても
- モジュールパス上の全モジュールをrequires
- 自分の全パッケージをexports
などの措置が行われますが、あくまで経過措置なのでJava9を使うのならmodule-info.javaにより適切な設定を行うのがいいと思います。
以上、Java9で最低限これだけは押さえておけという内容をご紹介しました。
実際に開発を行うにはモジュールシステムやその他の内容についてもっと知っておく必要がありますが、この記事をきっかけにJava9についてより詳しい情報を調べる足掛かりになれば幸いです。