Java 9のJShellにおけるフォワードリファレンス(前方参照)とは?
JShellとは
JShellは、Java 9から導入されたコマンドラインツールです。単純なステートメントや複合ステートメントはもちろん、メソッドやクラス全体といったJavaのコードをその場で入力・評価し、結果を即座に表示できます。REPL(Read-Eval-Print Loop)環境として、小さなコード断片の動作確認や学習に非常に便利なツールです。
フォワードリファレンス(前方参照)とは
フォワードリファレンス(前方参照)とは、JShellに入力済みのコードにはまだ存在しないメソッド、変数、クラスを参照するコマンドのことを指します。
JShellではコードが順番に1行ずつ入力され、評価されていくため、まだ定義されていない要素への参照は一時的に「未解決」の状態になります。JShellはこのような前方参照を、以下の場所でサポートしています。
- メソッド本体
- 戻り値の型
- パラメータの型
- 変数の型
- クラス内部
未宣言の変数を参照する例
次のコードスニペットでは、JShell上でforwardReference()というメソッドを作成しています。このメソッドは、参照先の変数が宣言されるまで呼び出すことができません。実際に呼び出そうとすると、次のような警告メッセージが表示されます。
C:\Users\User>jshell
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro
jshell> void forwardReference() {
...> System.out.println(notYetDeclared);
...> }
| created method forwardReference(), however, it cannot be invoked until variable notYetDeclared is declared
jshell> forwardReference()
| attempted to call method forwardReference() which cannot be invoked until variable notYetDeclared is declaredメソッド作成時点では「変数 notYetDeclared が宣言されるまで呼び出せない」という注意が表示され、実行を試みた段階でも同じ内容の警告が出力されているのが分かります。
変数を宣言して前方参照を解決する
続いて、文字列を返す変数「notYetDeclared」を宣言します。これにより前方参照が解決され、改めてJShellでforwardReference()を呼び出すと、今度は正常に「variable is declared」という文字列が出力されます。
jshell> String notYetDeclared = "variable is declared" notYetDeclared ==> "variable is declared" jshell> forwardReference() variable is declared
このように、JShellのフォワードリファレンス機能を利用すると、依存する変数やメソッドを後から定義しても、最終的に正しく動作するコードを段階的に構築できます。対話的な開発において、柔軟なコーディング体験を提供してくれる便利な仕組みといえるでしょう。
-
Java 9のJShellで使える「/edit」コマンドの種類と使い方
JShellは、Java 9で導入されたコマンドラインツールです。main()メソッドを用意しなくても、宣言・ステートメント・式をその場で評価できるのが大きな特徴です。さらに、JShellにはJShell Edit Padという簡易テキストエディタが組み込まれており、「/edit」コマンドで起動することで、入力済みのコードを手軽に編集できます。 /editコマンドの3つの形式 JShellで利用できる「/edit」コマンドには、次の3つの形式があります。 /edit /edit [ID] /edit [コード名] /edit:引数なしで実行すると、現在アクティブなすべてのコードがテキストエデ
-
JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説
StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T