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

Java 9のインターフェースで使えるプライベートメソッドのルールと使い方を解説

Java 9では、インターフェースプライベートメソッドという新機能が追加されました。private修飾子を使用して定義でき、Java 9以降では、インターフェース内にprivateメソッドprivate staticメソッドの両方を記述することが可能です。

インターフェースにおけるプライベートメソッドのルール

  • メソッド本体が必須: プライベートメソッドにはインターフェース内で本体(処理内容)が必要です。通常の抽象メソッドのように宣言することはできません。本体なしで宣言しようとすると、「This method requires a body instead of a semicolon(セミコロンの代わりにメソッド本体が必要です)」というエラーが発生します。
  • abstractとの併用不可: インターフェース内でprivateabstractの両方の修飾子を組み合わせて使用することはできません。
  • staticメソッドからのアクセス: インターフェースのstaticメソッドからプライベートメソッドへアクセスしたい場合は、そのメソッドをprivate staticメソッドとして宣言する必要があります。非staticメソッドへの静的参照は行えないためです。
  • 非staticコンテキストからの利用: private staticメソッドは非staticなコンテキストからも使用できます。つまり、インターフェースのdefaultメソッドから呼び出すことが可能です。

構文

interface <interface-name> {
    private methodName(parameters) {
        // 何らかの処理
    }
}

サンプルコード

interface TestInterface {
    default void methodOne() {
        System.out.println("This is a Default method One...");
        printValues(); // プライベートメソッドを呼び出し
    }
    default void methodTwo() {
        System.out.println("This is a Default method Two...");
        printValues(); // プライベートメソッドを呼び出し
    }
    private void printValues() { // インターフェース内のプライベートメソッド
        System.out.println("methodOne() called");
        System.out.println("methodTwo() called");
    }
}
public class PrivateMethodInterfaceTest implements TestInterface {
    public static void main(String[] args) {
        TestInterface instance = new PrivateMethodInterfaceTest();
        instance.methodOne();
        instance.methodTwo();
    }
}

実行結果

This is a Default method One...
methodOne() called
methodTwo() called
This is a Default method Two...
methodOne() called
methodTwo() called

プライベートメソッドを使うメリット

Java 8でdefaultメソッドが導入された際、複数のdefaultメソッド間で共通処理を外部に公開せずに再利用したいという課題がありました。Java 9のプライベートメソッドを活用することで、以下のようなメリットが得られます。

  • defaultメソッド間で重複するコードを1か所にまとめられ、保守性が向上します。
  • 補助的な処理を実装クラスから隠蔽できるため、インターフェースのAPI設計がより安全になります。
  • private staticメソッドを利用すれば、staticメソッドからも共通処理を呼び出せます。
  1. Java 9のSubscriptionインターフェースのルールとは?基本から徹底解説

    Java 9で導入されたReactive Streams(java.util.concurrent.Flow)において、SubscriptionはPublisherとSubscriberの間のデータ交換を仲介するための重要な役割を担います。Subscriptionは必ず1つのPublisherと1つのSubscriberのペアでのみ共有されます。そのため、subscribe()メソッドは生成されたSubscriptionを返さず、戻り値はvoidになっています。SubscriptionはonSubscribe()メソッドのコールバックを通じてのみSubscriberへ渡されます。Subscri

  2. Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説

    @Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性