Java 9のJShell(REPL)における7つのステータス状態とは?
REPLは「Read-Evaluate-Print-Loop(読み込み・評価・出力・ループ)」の略称で、対話形式でコードを実行できる環境を指します。JShellでは、入力された各ステートメント(スニペット)がそれぞれ独自の状態を持っており、この状態からスニペットや変数の実行ステータスを判別できます。具体的には、コードを評価するJShellインスタンスのeval()メソッドの戻り値を通じて、その状態を確認することが可能です。
Java 9のJShellには、以下の7種類のステータス状態が定義されています。
- DROPPED:スニペットが非アクティブな状態です。/dropコマンドなどで削除された場合に該当します。
- NONEXISTENT:スニペットがまだ存在しないため、非アクティブな状態です。
- OVERWRITTEN:新しいスニペットによって置き換えられたため、非アクティブな状態です。
- RECOVERABLE_DEFINED:宣言スニペットであり、本体に未解決の参照やその他の問題がありますが、後続の操作で回復可能な状態です。
- RECOVERABLE_NOT_DEFINED:宣言スニペットであり、未解決の参照などの問題を抱えていますが、回復可能な状態です。ただし既存のコードからは参照できません。
- REJECTED:初回評価時にコンパイルに失敗し、JShellの状態を変更しても有効にできないため、非アクティブな状態です。
- VALID:スニペットが有効であり、正常に実行できる状態です。
実装例
以下は、eval()メソッドで複数のステートメントを評価し、status()メソッドでスニペットの状態を取得するサンプルコードです。
import java.util.List;
import jdk.jshell.*;
import jdk.jshell.Snippet.Status;
public class JShellTest {
public static void main(String args[]) {
JShell shell = JShell.create();
List<SnippetEvent> events = shell.eval("int a, b, sum; " + "a = 12; b = 11; sum = a + b; " +
"System.out.println(sum);");
for(SnippetEvent event : events) {
Snippet snippet = event.snippet();
Snippet.Status snippetstatus = shell.status(snippet);
if(snippetstatus == Status.VALID) {
System.out.println("正常に実行されました");
}
}
}
}
実行結果
正常に実行されました 正常に実行されました 正常に実行されました
この例では、変数宣言と代入の各ステートメントがすべてStatus.VALIDと判定され、正常に実行されたことが確認できます。このようにSnippet.Statusを活用することで、JShell上のコードの状態をプログラム的に把握し、動的なコード評価ツールや学習用アプリケーションの構築に役立てることができます。
-
Java 9 JShellの起動スクリプト(DEFAULT・JAVASE・PRINTING)の違いと使い方
JShellは、Java 9で導入された対話型のJavaシェルツールです。コマンドラインプロンプトから起動でき、入力したコードをその場で評価して結果を即座に表示します。いわゆるREPL(Read-Evaluate-Print-Loop:読み込み→評価→表示→繰り返し)ツールとして動作するため、コード断片の動作確認やAPIの学習に非常に便利です。 起動スクリプトの指定方法(--startupフラグ) JShellでは、起動時にスクリプトを読み込むことで、あらかじめ定義済みのimport文や便利なメソッドを使える状態でセッションを開始できます。起動スクリプトを指定するには「--startup」フ
-
Java 9のJShellで使える「/edit」コマンドの種類と使い方
JShellは、Java 9で導入されたコマンドラインツールです。main()メソッドを用意しなくても、宣言・ステートメント・式をその場で評価できるのが大きな特徴です。さらに、JShellにはJShell Edit Padという簡易テキストエディタが組み込まれており、「/edit」コマンドで起動することで、入力済みのコードを手軽に編集できます。 /editコマンドの3つの形式 JShellで利用できる「/edit」コマンドには、次の3つの形式があります。 /edit /edit [ID] /edit [コード名] /edit:引数なしで実行すると、現在アクティブなすべてのコードがテキストエデ