JShellは、完全なアプリケーションをコンパイルして実行しなくても、シェル環境でコードスニペットを実行するためのコマンドラインツールです。 JShellは、Java 9の新機能です。JShellは、アプリケーションの開発時にコードスニペットをテストおよびデバッグするために使用できます。 JShell入力は、完全なコードスニペットの形式である必要があります。 JShellについては、「NetBeans 9.0、パート1のJava 9でJShellを使用する」と「NetBeans9.0、パート2のJava 9でJShellを使用する」の2つの記事で紹介し、 importの実行について説明しました。 ステートメント、変数の宣言と使用、文字列の比較 s、および実行中のステートメント。この続きの記事では、Javaメソッドのスニペットを実行します。この記事には次のセクションがあります:
- 環境の設定
- メソッドの使用
- メソッド定義の変更
- メソッドのオーバーロード
- メソッドへの前方参照の作成
- リスト方法
- トップレベルのメソッド宣言で許可されていない修飾子
- 結論
環境の設定
以前の記事で説明したように、NetBeansをダウンロードしてインストールします。 [ツール]>[Javaプラットフォームシェルを開く]を選択して、JShellを起動します。 、図1に示すように。
図1: [ツール]>[Javaプラットフォームシェルを開く]
メソッドの使用
メソッド は、Javaアプリケーションの場合と同じように、JShellで宣言されますが、いくつかの違いがあります。これについても、このセクションで説明します。例として、メソッド triple(int)を宣言します intが必要です 引数を取り、 intを返します 値。
int triple(int i) { return i*3; }
JShellでコードスニペットを実行すると、メソッドが作成されます。
[10]-> int triple(int i) { return i*3; } | created method triple(int)
メソッドtripleを呼び出します intを使用 引数としての値。
triple(1)
引数の値は3倍になり、返されます。
[11]-> triple(1) | $13 ==> 3 [12]->
このメソッドには戻り値のタイプとパラメーターがありますが、 publicなどのアクセス修飾子はありません。 、プライベート 、または保護 。これは、すべてのトップレベル宣言と同様に、トップレベルのメソッド宣言が暗黙的にパブリックであるためです。トップレベルのメソッド宣言のアクセス修飾子はすべて無視されます。以下のすべてのメソッド宣言は、前のメソッド宣言と同等です。
[1]-> private int triple(int i){ return 3*i; } | created method triple(int) [2]-> protected int triple(int i){ return 3*1; } | replaced method triple(int) [3]-> public int triple(int i){ return 3*i; } | replaced method triple(int) [4]->を置き換えました
JShellは、コンパイル時エラーがある場合はそれを表示します。例として、メソッドの戻り型を tripleにします。 文字列として エラーメッセージが表示されます。
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
メソッド定義の変更
Javaアプリケーションによって生成されず、このセクションにすでに2回リストされている出力メッセージは、「置換されたメソッド…」です。このメッセージは、メソッド定義が変更されたことを示しています。メソッド宣言およびその他の宣言を置換/変更するための規定は、テストを容易にすることです。
新しいメソッドを定義せずにメソッドを変更または置換するには、メソッド名と、パラメーターの数、タイプ、順序などのメソッドパラメーターによって設定されるメソッドシグネチャを変更しないでください。例として、メソッド helloを宣言します リターンタイプvoid および文字列 タイプパラメータ。
[4]-> void hello(String s){ } | created method hello(String)
次に、同じメソッド helloを宣言します リターンタイプString 、文字列 タイプパラメータ、およびreturnステートメント。 helloの以前のメソッド宣言 交換されます。
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->を置き換えました
メソッドhello(String)を呼び出します 2番目のメソッド定義は、「HelloJohn」メッセージを出力するために呼び出されます。
[6]-> hello("John") | $5 ==> "Hello John" [7]->
メソッド引数は、次のスニペットのように、必要に応じてメソッド呼び出しで連結されます。
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
メソッドを変更する前の例では、戻りタイプ voidを置き換えました。 文字列 。メソッドを置き換えるためにReturnを変更する必要はありません。例として、メソッド helloを定義します 次のように。
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
次に、 returnのみを変更します 声明。メソッドhello(String、String) 交換されます。
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)を置き換えました
メソッドコードスニペットを実行する別の例として、メソッド hello(String str1、String str2)を定義します。 リターンタイプString[] 。
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
2つの引数を指定してメソッドを呼び出し、配列を返します。
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
メソッドのオーバーロード
Javaアプリケーションの場合と同様に、メソッドがオーバーロードされる場合があります。メソッドを宣言するhello(String s) 。
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
メソッドを呼び出してメッセージを出力します。
[2]-> hello("John") | $1 ==> "Hello John"
別のメソッドを宣言するhello(String、String) 。
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
メソッドを呼び出してメッセージを出力します。
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
メソッドへの前方参照の作成
JShellは、メソッドへの前方参照の作成をサポートしています。 フォワードリファレンス まだ定義されていないメソッドを呼び出します。メソッドを宣言するmain(String) メソッドhello(String)への参照を作成します 、まだ定義されていません。メソッドmain(String) 作成されますが、メソッド hello(String)まで呼び出すことはできません 定義されています。
[1]-> String main(String str){ return "Hello "+hello(str); } | created method main(String), however, it cannot be invoked until | method hello(java.lang.String) is declared
メソッドmain(String)を呼び出します 呼び出すことができないことを示すメッセージが出力されます。
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
メソッドhello(String)を宣言します main(String)によって参照されます 。
[3]-> String hello(String name){ return name; } | created method hello(String)
続いて、メソッド main(String)を呼び出します。 再び呼び出されます。
[4]-> main("Michael") | $1 ==> "Hello Michael"
「;」 1行に1つずつ追加される最上位の変数宣言およびメソッド宣言に追加されていない場合は、暗黙的に追加されます。しかし ";"メソッド内のステートメントでは暗黙的ではありません。例として、次のメソッドを宣言すると、エラーが出力されます。
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
リスト方法
特定のJShellセッションで定義されたメソッドは、 / methodsで一覧表示されます。 指図。実例を示すために、いくつかのメソッドを定義します。
[1]-> int triple(int i) { return i*3; } | created method triple(int) [2]-> String hello(String s){ return "Hello" + s; } | created method hello(String) [3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String) [4]-> int average(int i,int j){ return (i+j)/0; } | created method average(int,int)
/ methodsを実行します コマンドを実行すると、追加されたすべてのメソッドが一覧表示されます。
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
トップレベルのメソッド宣言で許可されていない修飾子
一方、修飾子は public 、プライベート 、および保護 トップレベルのメソッド宣言では無視され、パブリックアクセスを使用してメソッド定義が暗黙的に作成されます。他の特定の修飾子は無視されず、トップレベルのメソッド宣言では許可されません。これらの修飾子は、特定のコンテキスト内で重要であり、コードスニペットをテストするJShellのコンテキストでは適切でないため、トップレベルでは許可されていません。
修飾子static クラスまたはインターフェースのコンテキストでメソッドとともに使用される場合に重要性がありますが、トップレベルでは使用されません。例として、 staticを含む次のメソッド宣言を実行します 。
[1]-> static String hello(String name){ return "Hello "+name; } | Warning: | Modifier 'static' not permitted in top-level declarations, | ignored | static String hello(String name){ | ^----^ | created method hello(String)
静的 修飾子は無視され、警告が出力されますが、メソッドは作成されます。メソッドを呼び出すことができます。
[2]-> hello("John") | $1 ==> "Hello John" [3]->
同様に、修飾子 final JShellはコードスニペットを動的に実行し、メソッド(または変数、またはクラス)を宣言するように設計されているため、メソッド宣言であれ他の宣言であれ、トップレベルでは意味がありません。 final スニペットを変更できなくなります。例として、 finalを追加します メソッドの修飾子。 最終 修飾子は無視され、警告が生成され、メソッド定義は finalなしで作成されます 。
[2]-> final int triple(int i){ return 3*i; } | Warning: | Modifier 'final' not permitted in top-level declarations, | ignored | final int triple(int i){ | ^---^ | created method triple(int)
メソッドを呼び出すと、結果が出力されます。
[3]-> triple(5) | $1 ==> 15 [4]->
メソッドであろうと他の宣言であろうと、他のいくつかの修飾子もトップレベルで許可されていません。一方、修飾子は静的 および最終 無視され、メソッド定義が作成され、修飾子 abstract およびネイティブ トップレベルのメソッドではエラーが発生し、メソッドは作成されません。
[1]-> abstract String hello(String s){ return "Hello "+s; } | Error: | Modifier 'abstract' not permitted in top-level declarations | abstract String hello(String s){ | ^------^ [1]-> [1]-> native String hello(String s){ return "Hello "+s; } | Error: | Modifier 'native' not permitted in top-level declarations | native String hello(String s){ | ^----^
修飾子デフォルト および同期 トップレベルのメソッド宣言またはその他の宣言でも許可されておらず、エラーが発生します。
結論
この記事では、JShellでのJavaメソッドのコードスニペットの実行について説明しました。後続の記事では、Javaクラス、インターフェイス、および配列のコードスニペットの実行について説明します。