「Java SE 9」がいよいよ7月リリース。櫻庭祐一氏と吉田真也氏に注目ポイント、移行時の留意点を聞いた

Oracle Java & Developers編集部
2017-04-12 16:40:00
  • このエントリーをはてなブックマークに追加

JShellで「このコードをちょっと動かしてみたい」が手軽にできるようになる

──続いて、JigsawとともにJava SE 9で初めて導入されるJShellを取り上げたいのですが、吉田さん、これはどんな機能で、どう使うものなのでしょうか?

吉田:JShellは、JavaのREPL(レプル。Read-Eval-Print-Loopの略)ツールです。REPLツールっていうのは、ターミナルでプログラムの一部を書くと、それが直接実行されて結果が得られるというものです。

 REPLツールを使うことにより、Java言語の勉強や、Java SE 9で追加された新たな文法を“ちょっと試す”といったことが、これまでよりも手軽にできるようになります。これまでは、「このコードを試してみたい」といった時、いちいち"public class Main { public static void ..."といった定型的なコードまで書き、クラス・ファイルを作ってコンパイルしなければ動かせませんでした。JShellを使うことで、それが不要になり、もっと簡単に目的のコードを実行できるようになるのです。例えば、IDEでプログラムを作っている時に、「このAPIの挙動はどうなってるのかな」と思ったら、すぐにJShellで動かして確認できます。そうやって挙動を確認したら、またIDEに戻って開発を続けられるようになるので、細かい部分で開発の効率が高まるんじゃないかと思っています。

櫻庭:私は最近、「Exploratory Programming」という言葉を知りました。これは「探索しながらプログラミングする」という意味で、JShellはまさにそれを助けるツールだと言えます。

──REPLツールに対するニーズは高かったんですか?

櫻庭:他の言語には大体用意されていますし、これがあればJava学習の最初のハードルが大きく下がるので、「教育目的で必要だ」という声は以前からありました。ただ、Exploratory Programmingという考え方は、テストを重視する文化があるからこそ出てきたものだ思います。要は、「どういう挙動なのかを調べながら作る」、「短いサイクルでテストしながら作る」というアプローチです。

──ではJShellも“やっと入った”機能なんですね。今後は、JShellを使った開発者向けの支援ツールがいろいろと出てくるのでしょうか?

櫻庭:IDEと組み合わせて使うツールは出てくるでしょう。また、テスト・システムも考えられます。JUnitのテストケースとか書くのが面倒くさいのですが、JShellで書けると楽になるかもしれない。そう思いませんか?

吉田:確かに、JShellで書いたコードをテストケースとして吐き出せたら嬉しいですね。

櫻庭:今はIDEがJUnitのテストケースの雛型を作ってくれるので、その中にコードを足せばよいのですが、それでもちょっと面倒くさい。JShellで試しながらテストを書いて、問題がなければそのコードをそのままテストケースにするっていう具合にできれば、テストを書くことのハードルがもっと下がると思うのですが…

──初学者にとっての嬉しい側面は何でしょうか?

櫻庭:“Hello World”を1行で書けることですね(笑)

──そこは、はしょってはダメなんじゃないですか?(笑)

櫻庭:でも、やっぱり大きいと思います。Javaの解説書の多くは、最初にクラスを作るところから入りますが、その段階でクラスの説明をしても初学者にはよくわからないと思うんですよ。クラスについて理解してもらうにはオブジェクト指向の説明が必要なので…。でも、いきなりオブジェクト指向の説明から入ると初学者には取っつきづらいので、まずその話は置いておいて、「“System out.println”って書けば出力できますよ」って始めたいわけです。ここが一番重要なところですから。

吉田:JShellを使った初学者向けの解説書が出てきたら、Javaプログラミングの学習の仕方が変わるかもしれませんね。

Java SE 9はCollection APIも充実。Stream APIも使いやすくなる

──Jigsaw、JShellのほかに、Java SE 9で追加された便利な機能があれば教えてください。

櫻庭:細かいものは沢山あるのですが、私が嬉しいのはコレクション周りのメソッドが充実したことです。例えば、特定の要素のListを作るのに、これまでは"new ArrayList<>()"としたうえで"list.add(...)"という具合にリストのインスタンスを作り、要素を追加していかなくてはいけませんでした。これに対し、Java SE 9ではファクトリー・メソッドのofなどが追加され、こうした処理が簡単に書けるようになりました。あと、不変のListも追加されましたね。

吉田:List.ofで作ったListが全てイミュータブルになるんですよね。

櫻庭:これまでも、工夫すれば同じものも実現できたのですが、それと比べてもかなりよいですよ。

吉田:Stream APIも強化されましたね。Java SE 8で追加されたStream APIでは一応無限のデータ列も扱えたのですが、それを便利に操作できるAPIが少なく、使いづらかったんです。例えば、無限のデータから先頭の5個の要素を取得するのは簡単なのですが、「この条件を満たしたら切る」といったことができませんでした。Java SE 9のStream APIでは、そうしたこともできるようになっています。

櫻庭:Optionalもストリームの中で使いやすくなったよね。

デフォルトがG1GCに変更で運用担当者は注意!──Java SE 9への移行で注意すべきこと

──ここまでに伺ったことのほかに、読者がJava SE 9へ移行する際に気をつけるべき点はありますか?

櫻庭:運用担当の方は特に注意してほしいのですが、デフォルトのガーベジ・コレクション(GC)が「G1GC」に変更され、チューニング方法がこれまでと大きく変わります。運用をやっている方は、初めはちょっと大変なんじゃないかと思います。

──JVM周りも変わるんですね。

櫻庭:JVMやGCのログなども、今まではアドホックにいろいろ追加されてきたため凄く複雑だったのですが、それが統一されたフォームになるので、どのような情報が新たに追加され、どういった表現になるのかといったことにも注意していただきたいですね。

吉田:Jigsawへの移行に関しては、既存プログラム内のライブラリの依存関係を調べるツールなどがJDKに用意されているので、どのツールをどう活用すればよいかについての情報収集も大切です。

──Java SE 8でラムダ式が導入された時のインパクトとはどう違いますか?

櫻庭:ラムダ式は使わなくても済むので、使いたくない人は気にしなくてもよいのですが、Jigsawはそうもいかない点が異なりますね。

──避けては通れないということですね。そういう点では、Jigsawのほうが圧倒的に影響が大きそうですね。

櫻庭:使わずに済ませる方法もありますが、今後、それで続けていけるかどうかは微妙です。他のライブラリの対応が進んだら、いつか移行せざるをえない時が来るでしょう。

──だから、早く勉強して取り組みを始めるべきだと。

櫻庭:勉強だけは早くしておいたほうがいいですね。ただ、Jigsawはドキュメントが少ないんですよ。G1GCのほうが充実しているくらいで…