Java 9のJShellにおける外部宣言のルールとは?修飾子の扱いを徹底解説
JShellとは
JShellはJava 9で導入されたコマンドラインツールであり、Java初の公式REPL(Read-Eval-Print Loop)ツールです。ユーザーが入力したコードを読み取り、評価し、その結果を即座に出力するという、手軽なプログラミング環境を実現します。
通常のJavaプログラムでは、すべてのコードはクラスやインターフェースの中に記述する必要がありますが、JShellではクラスやインターフェースの外側に直接宣言を書くことができます。このような「外部宣言」には、以下のルールが適用されます。
外部宣言のルール
1)アクセス修飾子(public / protected / private)は無視される
public、protected、privateといったアクセス修飾子は無視されます。つまり、すべての宣言スニペットは、他のすべてのスニペットから自由にアクセス可能です。
jshell> private int i = 10;
i ==> 10
jshell> System.out.println(i);
10
2)final修飾子は無視される
final修飾子も無視されるため、値の変更や継承が許可されます。トップレベルの宣言にfinalを付けると、警告が表示されます。
jshell> final class A {void m() {} }
| Warning:
| Modifier 'final' not permitted in top-level declarations, ignored
| final class A {void m() {} }
| ^---^
| created class A3)static修飾子は無視される
JShellにはコンテナとなるクラスが存在しないため、static修飾子は意味を持たず、無視されます。
jshell> static char letter = 'A';
| Warning:
| Modifier 'static' not permitted in top-level declarations, ignored
| static char letter = 'A';
| ^----^
letter ==> 'A'
4)defaultおよびsynchronized修飾子は使用不可
defaultおよびsynchronized修飾子は許可されておらず、使用するとエラーになります。
jshell> synchronized void method() {}
| Error:
| Modifier 'synchronized' not permitted in top-level declarations
| synchronized void method() {}
| ^----------^5)abstract修飾子はクラス内でのみ使用可能
abstract修飾子はクラスに対してのみ許可されます。メソッドなどに直接付けることはできません。
jshell> abstract void method();
| Error:
| Modifier 'abstract' not permitted in top-level declarations
| abstract void method();
| ^------^
まとめ
JShellの外部宣言では、アクセス制御に関わる修飾子(public / protected / private)やfinal、staticは自動的に無視され、defaultとsynchronizedはエラーとなります。abstractはクラスにのみ適用可能です。これらのルールを理解しておくことで、JShellでの試行錯誤がよりスムーズになり、エラーや警告に戸惑うことなく効率的にコードを検証できるでしょう。
-
Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説
@Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性
-
Java 9のJShellで使える「/edit」コマンドの種類と使い方
JShellは、Java 9で導入されたコマンドラインツールです。main()メソッドを用意しなくても、宣言・ステートメント・式をその場で評価できるのが大きな特徴です。さらに、JShellにはJShell Edit Padという簡易テキストエディタが組み込まれており、「/edit」コマンドで起動することで、入力済みのコードを手軽に編集できます。 /editコマンドの3つの形式 JShellで利用できる「/edit」コマンドには、次の3つの形式があります。 /edit /edit [ID] /edit [コード名] /edit:引数なしで実行すると、現在アクティブなすべてのコードがテキストエデ