Java 9のインターフェースでプライベートメソッド・プライベート静的メソッドは定義できるのか?
はい、Java 9以降では、インターフェース内にプライベートメソッドやプライベート静的(static)メソッドを定義することができます。
この機能は、defaultメソッドやstaticメソッド間で共通する処理をまとめ、コードの重複(冗長性)を排除するために導入されました。プライベートメソッドはそのインターフェースの内部からのみアクセス可能であり、他のインターフェースやクラスからアクセスしたり継承したりすることはできません。つまり、実装の詳細を外部に公開せずに隠蔽できるのが大きな特徴です。
構文
interface <interface-name> {
private static void methodName() {
// 処理内容
}
private void methodName() {
// 処理内容
}
}
押さえておきたいルール
- プライベートメソッドには必ずメソッド本体(実装)が必要です。
abstractとの併用はできません。 - インスタンスのプライベートメソッドは、同じインターフェース内のdefaultメソッドなどから呼び出せます。
- プライベートstaticメソッドは、staticメソッドやdefaultメソッドの両方から呼び出し可能です。
- インターフェースを実装したクラス側からは、これらのプライベートメソッドを直接呼び出すことはできません。
サンプルコード
interface Java9Interface {
public abstract void method1();
public default void method2() {
method4();
method5();
System.out.println("Inside default method");
}
public static void method3() {
method5(); // 静的メソッドの中から別の静的メソッドを呼び出し
System.out.println("Inside static method");
}
private void method4() { // プライベートメソッド
System.out.println("Inside private method");
}
private static void method5() { // プライベート静的メソッド
System.out.println("Inside private static method");
}
}
public class PrivateStaticMethodTest implements Java9Interface {
@Override
public void method1() {
System.out.println("Inside abstract method");
}
public static void main(String args[]) {
Java9Interface instance = new PrivateStaticMethodTest();
instance.method1();
instance.method2();
Java9Interface.method3();
}
}
実行結果
Inside abstract method Inside private method Inside private static method Inside default method Inside private static method Inside static method
このように、defaultメソッド method2() やstaticメソッド method3() の内部で共通処理を担うプライベートメソッドを呼び出すことで、ロジックを一箇所に集約できます。Java 8まではdefaultメソッド間で共通処理を共有する手段がなく、コードが重複しがちでしたが、Java 9のプライベートメソッドによって保守性の高いインターフェース設計が可能になりました。
-
Javaのpack()メソッドとは?使い方とsetSize()との違いを解説
pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。