Java 9 - REPLの探究

Java 9 – REPLの調査

1. 前書き

この記事は、次のJava 9リリースのJDKにバンドルされているインタラクティブなREPL(Read-Evaluate-Print-Loop)コンソールであるjshellについてです。 概念に慣れていない人のために、REPLを使用すると、任意のコードスニペットをインタラクティブに実行し、その結果を評価できます。

REPLは、アイデアの実行可能性をすばやくチェックしたり、 StringまたはSimpleDateFormatのフォーマットされた文字列。

2. ランニング

開始するには、REPLを実行する必要があります。

$JAVA_HOME/bin/jshell

シェルからのより詳細なメッセージングが必要な場合は、-vフラグを使用できます。

$JAVA_HOME/bin/jshell -v

準備ができたら、友好的なメッセージと、おなじみのUnixスタイルのプロンプトが下部に表示されます。

3. メソッドの定義と呼び出し

メソッドは、署名と本文を入力して追加できます。

jshell> void helloWorld() { System.out.println("Hello world");}
|  created method helloWorld()

ここでは、ユビキタスな「hello world」メソッドを定義しました。 通常のJava構文を使用して呼び出すことができます。

jshell> helloWorld()
Hello world

4. 変数

変数は、通常のJava宣言構文で定義できます。

jshell> int i = 0;
i ==> 0
|  created variable i : int

jshell> String company = "example"
company ==> "example"
|  created variable company : String

jshell> Date date = new Date()
date ==> Sun Feb 26 06:30:16 EST 2017
|  created variable date : Date

セミコロンはオプションです。 変数は、初期化せずに宣言することもできます。

jshell> File file
file ==> null
|  created variable file : File

5. 式

有効なJava式が受け入れられ、評価の結果が表示されます。 結果の明示的なレシーバが提供されない場合、「スクラッチ」変数が作成されます。

jshell> String.format("%d of bottles of beer", 100)
$6 ==> "100 of bottles of beer"
|  created scratch variable $6 : String

REPLは、$6という名前のスクラッチ変数を作成したことを通知することで非常に役立ちます。値は「壁にビールのボトル100本」で、タイプはStringです。

複数行の式も可能です。 Jshell is smart enough to know when an expression is incomplete and will prompt the user to continue on a new line:

jshell> int i =
   ...> 5;
i ==> 5
|  modified variable i : int
|    update overwrote variable i : int

式の継続を示すために、プロンプトがインデントされた…>にどのように変化したかに注意してください。

6. コマンド

Jshellは、Javaステートメントの評価に関係のないかなりの数のメタコマンドを提供します。 通常の操作と区別するために、すべてスラッシュ(/)で始まります。 たとえば、/helpまたは/?を発行して、使用可能なすべてのコマンドのリストを要求できます。

それらのいくつかを見てみましょう。

6.1. 輸入

現在のセッションでアクティブなすべてのインポートを一覧表示するには、/importコマンドを使用できます。

jshell> /import
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*

ご覧のとおり、シェルはかなりの数の便利なインポートが既に追加された状態で開始されます。

6.2. リスト

REPLでの作業は、フル機能のIDEをすぐに使用できるほど簡単ではありません。どの変数がどの値を持ち、どのメソッドが定義されているかなどを忘れがちです。 シェルの状態を確認するには、/var/methods/list、または/history:を使用できます。

jshell> /var
| int i = 0
| String company = "example"
| Date date = Sun Feb 26 06:30:16 EST 2017
| File file = null
| String $6 = "100 of bottles of beer on the wall"

jshell> /methods
| void helloWorld()

jshell> /list

 1 : void helloWorld() { System.out.println("Hello world");}
 2 : int i = 0;
 3 : String company = "example";
 4 : Date date = new Date();
 5 : File file;
 6 : String.format("%d of bottles of beer on the wall", 100)

jshell> /history

void helloWorld() { System.out.println("Hello world");}
int i = 0;
String company = "example"
Date date = new Date()
File file
String.format("%d of bottles of beer on the wall", 100)
/var
/methods
/list
/history

/list/historyの違いは、後者は式に加えてコマンドを表示することです。

6.3. 保存中

式の履歴を保存するには、/saveコマンドを使用できます。

jshell> /save repl.java

これにより、式の履歴が、jshellコマンドを実行したのと同じディレクトリのrepl.javaに保存されます。

6.4. ロード中

以前に保存したファイルをロードするには、/openコマンドを使用できます。

jshell> /open repl.java

ロードされたセッションは、/var/method、または/listを発行することで確認できます。

6.5. 終了中

作業が完了すると、/exitコマンドでシェルを終了できます。

jshell> /exit
|  Goodbye

さようならjshell

7. 結論

この記事では、Java 9 REPLを取り上げました。 Javaはすでに20年以上使用されているので、おそらく少し遅れて到着しました。 ただし、Javaツールボックスのもう1つの価値あるツールであることが証明されるはずです。