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

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のプライベートメソッドによって保守性の高いインターフェース設計が可能になりました。

  1. Javaのpack()メソッドとは?使い方とsetSize()との違いを解説

    pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の

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

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