学習や動作確認に使用できるJShellとは
「JShell」とは、Java 9で提供される新たなツールの1つです。JShellを使えば、コードをjavaコマンドでコンパイルし、その後、javaコマンドで実行するという手順を行わなくても、実行結果が確認できます。
このような環境をREPL(Read-eval-print loop)と呼びます。JShellは、Java 9のSDKから標準で利用できるREPL環境です。
[Note]さまざまなREPL
REPL環境について他の言語も含めて体験してみたい方は、さまざまな言語でREPL環境を提供しているWebサービス、「repl.it」を利用してみてください。
これまでJavaを学習したい場合にはJava SEをインストールし、EclipseやNetBeans、またはIntelliJ IDEAなどのIDE環境をそろえるのが普通でした。他の言語での開発、特にスクリプト言語と比べると、たった1行のコードを実行するにも、実行までの手間がかかることが分かると思います。
例えばJavaScriptなら、リスト1のコードを実行するだけで結果が確認できます。
console.log("hello");
しかしJavaの場合は、リスト2の通り必ずmain文の中に処理を記述する必要があります。
class Main { public static void main(String[] args) { System.out.println("hello"); } }
この程度の違いであればいいですが、実際に学習が進むと、標準で提供されているAPIだけでなく、オープンソースなどで提供されているライブラリを使うようになります。実際の開発に近いレベルで学習するとなると他の環境に依存する割合が高いため、repl.itなどのサービスで対応することは難しくなるはずです。
そこで、JavaはJShellというツールを標準で用意しました。JShellは学習目的に特化しているわけではなく、以下の用途で利用可能です。
- Javaの学習目的
- APIの動作確認や、記事やサイトなどのサンプルコードの動作確認
- テスト
JShellの基本的な利用方法
それでは、実際にJShellを使ってみましょう。jshellコマンドを実行すると、リスト3の通り表示されます。
$jshell | JShellへようこそ -- バージョン9 | 概要については、次を入力してください: /help intro jshell>
この状態は、すでにリスト4の(1)のmainメソッドの中にいるイメージです。ここから自分で好きなコードを記述していけばいいので、簡単に結果を確認できます。
また、コードは順次実行していきます。その場で実行結果を表示でき、JShellという名前の通りShellコマンドを実行するように利用が可能です。
class Main { public static void main(String[] args) { // (1) ここにいるイメージ } }
それ以外にもJShell上でコードを確認する場合、これまでのJavaと同じコードを書く必要はなく、よりコードの確認がしやすいようになっています。
その違いは以下のリスト5(Base64でのエンコード・デコードコード)を見るとわかります。
jshell> import java.util.Base64.*; jshell> Base64.getEncoder(); // (1) 自動的に変数が定義される $2 ==> java.util.Base64$Encoder@1ce92674 jshell> $2.encodeToString("hello world".getBytes()); $3 ==> "aGVsbG8gd29ybGQ=" // (2) Stringオブジェクトの内容の表示 jshell> Base64.getDecoder(); $4 ==> java.util.Base64$Decoder@544fe44c jshell> $4.decode($3.getBytes()); $5 ==> byte[11] { 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100 } // (3) byte[]型の表示 jshell> new String($5); $6 ==> "hello world" jshell> /exit (4)終了 | 終了します
通常のソースコードを書く場合と最も異なるのは、(1)のように変数を定義する必要はなく、自動的に${数値}のような変数が定義される点です。もちろん、自分で定義すればその変数名で定義が可能です。
また、(2)や(3)のように、実行した際のオブジェクトの中身がわかりやすい形式で表示されます。そのためJShellでは、変数の内容を確認するためにSystem.out.printlnなどのメソッドを利用する必要はありません。このように逐次、実行状況やオブジェクトの状況が確認しやすくなっています。
終了するときは(4)の通り/exitで終了します。
JShellでのコード記述をより便利するエディタ機能
Javaのソースを記述する際は、テキストエディタではなくIDEを使うのが一般的でしょう。その理由の1つに、利用できるクラスやメソッドの自動補完機能やインラインヘルプ機能の存在があります。
JShellでも同様に、タブキーを押すことでリスト6のように対象を表示してくれます。また、対象が1つのみの場合は自動的に残りの部分のコードも補完されます。さらに、メソッドの引数の説明なども表示することも可能です。
jshell> Base64.[タブキー] Decoder Encoder class getDecoder() getEncoder() getMimeDecoder() getMimeEncoder( getUrlDecoder() getUrlEncoder() jshell> $4.[タブキー] decode( equals( getClass() hashCode() notify() notifyAll() toString() wait( wrap( jshell> Base64.getDecoder().decode([タブキー] byte[] Base64.Decoder.decode(byte[] src) Decodes all bytes from the input byte array using the Base64 encoding scheme, writing the results into a newly-allocated output byte array.The returned byte array is of the length of the resulting bytes. // 以下省略
なお、JShell内ではクラスを作成することなく、リスト7の通りメソッドも作成できます。作成したメソッドはJShell内でのグローバルなstaticメソッドとして定義されます。
jshell> public String ts(Object obj){ return obj.toString(); }
このような動作確認であれば、JShellのほうがIDEを用いるよりも簡単にできるはずです。