Java 9のJShellでトップレベル宣言に使用できない修飾子とは?
JShellは、Java言語の学習やJavaコードのプロトタイピングに役立つ対話型ツールです。REPL(Read-Evaluate-Print-Loop:読み込み・評価・出力・ループ)として動作し、宣言、文、式を入力すると即座に評価し、その結果をJShell上に出力します。このツールはコマンドラインから起動して利用します。
トップレベル宣言では、public、protected、private、static、finalといった修飾子は許可されておらず、これらを指定しても警告(warning)とともに無視されます。一方、トップレベルメソッドに対するsynchronized、native、abstract、defaultなどのキーワードは許可されず、エラーとなります。
以下のコード例では、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などをトップレベルメソッドに付与した場合はエラーとなるため、注意が必要です。
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。
-
JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例
JComboBoxはJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListener、ChangeListener、ItemListenerといったインターフェースを通じてイベントを受け取ることができます。 ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された