Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9のJShellでトップレベル宣言に使用できない修飾子とは?

JShellは、Java言語の学習やJavaコードのプロトタイピングに役立つ対話型ツールです。REPL(Read-Evaluate-Print-Loop:読み込み・評価・出力・ループ)として動作し、宣言を入力すると即座に評価し、その結果をJShell上に出力します。このツールはコマンドラインから起動して利用します。

トップレベル宣言では、publicprotectedprivatestaticfinalといった修飾子は許可されておらず、これらを指定しても警告(warning)とともに無視されます。一方、トップレベルメソッドに対するsynchronizednativeabstractdefaultなどのキーワードは許可されず、エラーとなります。

以下のコード例では、final変数とstatic変数をそれぞれ宣言しています。いずれの場合も、「Modifier 'final' or 'static' not permitted in top-level declarations, ignored(修飾子'final'または'static'はトップレベル宣言では許可されないため、無視されます)」という警告メッセージがユーザーに対して表示されます。

例1:final修飾子を使用した場合

C:\Users\User>jshell
| Welcome to JShell -- Version 9.0.4
| For an introduction type: /help intro

jshell> final int x = 0
| Warning:
| Modifier 'final' not permitted in top-level declarations, ignored
| final int x = 0;
| ^---^
x ==> 0

jshell> x = 1
x ==> 1

この例では、final修飾子を付けて変数xを宣言していますが、警告が表示され修飾子は無視されます。本来final変数は再代入できませんが、その後xに別の値「1」を代入できている点に注目してください。これはJShellのトップレベル宣言では修飾子が機能しないためです。

例2:static修飾子を使用した場合

jshell> static String str = "Tutorix"
| Warning:
| Modifier 'static' not permitted in top-level declarations, ignored
| static String str = "Tutorix";
| ^----^
str ==> "Tutorix"

同様に、static修飾子を付けた文字列変数strの宣言でも警告が表示され、修飾子は無視されたうえで変数が通常どおり宣言されます。

まとめ

JShellのトップレベル宣言では、アクセス修飾子(public、protected、private)やstatic、finalは意味を持たず、警告とともに無視されます。これは、JShellがクラス構造を持たないスニペット単位でコードを評価するREPLツールであるためです。一方、synchronized、native、abstract、defaultなどをトップレベルメソッドに付与した場合はエラーとなるため、注意が必要です。

  1. JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説

    invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。

  2. JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例

    JComboBoxはJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListener、ChangeListener、ItemListenerといったインターフェースを通じてイベントを受け取ることができます。 ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された