バルテックアドベントカレンダー2017用記事です。
CNN、RNNを使用して遊んでみようかと思っていたけど、担当日が12月2日で余り期間がなかったので別ネタで行こうかと思う。
2017年9月22日 Java 9がついにリリースされました。
が、リリースはされたけど、そういやお家PCにいれて無いし遊んでもいねぇなぁと思ったので9の新機能を試すついでに紹介していきたいと思います。
公式の?機能紹介文
http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JA17-Java9Features.pdf
とりあえずダウンロードして解凍してパス通して「java -version」叩いて見た。
うん、OK!!
#新機能1 「JShell」
今までJavaのコード書いている時に「あれ?文字列の末尾から3文字取り出すのって3だっけ?」とかちょっと挙動確認したいときにわざわざTest.javaなんか作ってコード書いて実行していたけどこれからはJshellから気軽に試せるようになった。
起動
jshellって叩けば起動する。
「あれ?文字列の末尾から3文字取り出すのって3だっけ?-3だっけ」って試すときはメインメソッドなぞ書かずに
System.out.println("123456".substring(3));
ってかくだけで行ける!!
おおお!楽!
んじゃクラスとかって定義できんのか?と思って実験
おおぉ!できる!
じゃあスクリプト化できるのか?と思って実験
とりあえず適当にいつものシェルスクリプトっぽく書いてみた
実行!!
う〜ん、一応実行されたけど・・・正規のルートでは無いってかんじか
ちょっと調べた結果ファイルに記述されたjshellは「/open」で食わせる感じ見たい
実行!!
実行された!!
jshellはただの実験場だと漠然と思ってたけど、スクリプト化できると考えると色々応用できそうですね
(多分jarファイルなども読み込ませて呼べたりするんだろうしコンパイルがいらないjavaと考えるとツールなんか作るときに最適かも?)
#新機能2 コレクションのファクトリ・メソッド
不変のListや、Mapをまとめて作成することができる。
出来た!
そういや不変と言っているということは・・・addしようとすると怒られる?
ちゃんと怒られた
これでクラス変数のLISTにstaticイニシャライザや、コンストラクタでだらだらList初期化書かずに済むね
#新機能3 クラスパス地獄からの脱却(Jigsawプロジェクト)
クイックスタートをまんま実行してみる
コードを書いて・・・
コンパイルして・・・実行!!
うまくいっているが、さすがに旨味を感じない・・・次!!
com.greetings -> com.astro という依存関係となっている。
コンパイルをしてみる。
com.astroをコンパイルしてから、com.greetingsをコンパイルしている。
よく見てみると、com.greetingsはcom.astroに依存しているにも関わらず、com.greetingsコンパイル時にクラスパスを指定していない。
では実行してみる。
おおおおお!クラスパスを指定していないにも関わらず、きちんと実行されている
依存モジュールの解決
module-info.javaに公開するモジュール名と、依存するモジュール名を記述して依存関係を指定するようです。
com.astroの「module-info.java」
「exports」で「公開」するモジュールが定義されている。
module org.astro { exports org.astro; }
com.greetingsの「module-info.java」
「requires」で「依存」するモジュールが定義されている。
module com.greetings { requires org.astro; }
うん、シンプルでわかりやすい!
まとめてコンパイル
前の例では、モジュールcom.greetingsとモジュールorg.astroが別々にコンパイルされていたが、1つのjavacコマンドで複数のモジュールをコンパイルすることもできるらしい
jarに固める
com.greetingsを作るときに「--main-class=com.greetings.Main」を指定している。
これはこの後にjarから実行する際に、マニフェストファイルのかわりに実行クラスを指定しているものかと思われる。
jarに固めたモノを実行
jarが入ったディレクトリを指定してどのモジュールを実行するか指定するだけでMainクラスがきちんと実行されている。
jarの詳細情報を表示
jar --describe-moduleを使用するとjarの詳細情報がみれるようです。
まとめ
Java9にはまだまだ新機能が有ります。(個人的に中核的なものは上記に書いたモノだと思うけど)
我々が業務で使うにはちょっと先だと思うけど、今のうちに遊んでおいて将来ドヤ顔するのも一興かと思います。
(Jigsawなんかはまだかなり奥が深いと思うので書籍化されるのを心待ちにしているのだけれど、もうちょっと先かな?)