LoginSignup
3

More than 5 years have passed since last update.

Java9の新機能紹介

Posted at

バルテックアドベントカレンダー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」叩いて見た。

Screenshot from 2017-12-02 14:01:49.png

うん、OK!!

新機能1 「JShell」

今までJavaのコード書いている時に「あれ?文字列の末尾から3文字取り出すのって3だっけ?」とかちょっと挙動確認したいときにわざわざTest.javaなんか作ってコード書いて実行していたけどこれからはJshellから気軽に試せるようになった。

起動

jshellって叩けば起動する。

Screenshot from 2017-12-02 14:10:55.png

「あれ?文字列の末尾から3文字取り出すのって3だっけ?-3だっけ」って試すときはメインメソッドなぞ書かずに

System.out.println("123456".substring(3));

ってかくだけで行ける!!

Screenshot from 2017-12-02 14:23:36.png

おおお!楽!

んじゃクラスとかって定義できんのか?と思って実験

Screenshot from 2017-12-02 14:28:14.png

おおぉ!できる!

じゃあスクリプト化できるのか?と思って実験

とりあえず適当にいつものシェルスクリプトっぽく書いてみた

Screenshot from 2017-12-02 14:36:21.png

実行!!

Screenshot from 2017-12-02 14:37:39.png

う〜ん、一応実行されたけど・・・正規のルートでは無いってかんじか

ちょっと調べた結果ファイルに記述されたjshellは「/open」で食わせる感じ見たい

先頭の「#!」文を消して・・・
Screenshot from 2017-12-02 14:42:33.png

実行!!

Screenshot from 2017-12-02 14:45:13.png

実行された!!

jshellはただの実験場だと漠然と思ってたけど、スクリプト化できると考えると色々応用できそうですね
(多分jarファイルなども読み込ませて呼べたりするんだろうしコンパイルがいらないjavaと考えるとツールなんか作るときに最適かも?)

新機能2 コレクションのファクトリ・メソッド

不変のListや、Mapをまとめて作成することができる。

Screenshot from 2017-12-02 15:02:38.png

出来た!

そういや不変と言っているということは・・・addしようとすると怒られる?

Screenshot from 2017-12-02 15:06:17.png

ちゃんと怒られた

これでクラス変数のLISTにstaticイニシャライザや、コンストラクタでだらだらList初期化書かずに済むね

新機能3 クラスパス地獄からの脱却(Jigsawプロジェクト)

クイックスタートをまんま実行してみる

コードを書いて・・・

Screenshot from 2017-12-02 16:12:10.png

コンパイルして・・・実行!!

Screenshot from 2017-12-02 16:13:25.png

うまくいっているが、さすがに旨味を感じない・・・次!!

Screenshot from 2017-12-02 16:22:55.png

com.greetings -> com.astro という依存関係となっている。
コンパイルをしてみる。

Screenshot from 2017-12-02 16:25:30.png

com.astroをコンパイルしてから、com.greetingsをコンパイルしている。
よく見てみると、com.greetingsはcom.astroに依存しているにも関わらず、com.greetingsコンパイル時にクラスパスを指定していない。

では実行してみる。

Screenshot from 2017-12-02 16:30:31.png

おおおおお!クラスパスを指定していないにも関わらず、きちんと実行されている

依存モジュールの解決

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コマンドで複数のモジュールをコンパイルすることもできるらしい

Screenshot from 2017-12-02 16:35:03.png

jarに固める

Screenshot from 2017-12-02 16:41:02.png

com.greetingsを作るときに「--main-class=com.greetings.Main」を指定している。
これはこの後にjarから実行する際に、マニフェストファイルのかわりに実行クラスを指定しているものかと思われる。

jarに固めたモノを実行

Screenshot from 2017-12-02 16:43:48.png

jarが入ったディレクトリを指定してどのモジュールを実行するか指定するだけでMainクラスがきちんと実行されている。

jarの詳細情報を表示

jar --describe-moduleを使用するとjarの詳細情報がみれるようです。

Screenshot from 2017-12-02 16:47:18.png

まとめ

Java9にはまだまだ新機能が有ります。(個人的に中核的なものは上記に書いたモノだと思うけど)
我々が業務で使うにはちょっと先だと思うけど、今のうちに遊んでおいて将来ドヤ顔するのも一興かと思います。
(Jigsawなんかはまだかなり奥が深いと思うので書籍化されるのを心待ちにしているのだけれど、もうちょっと先かな?)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3