web-dev-qa-db-ja.com

プライベートインターフェイスメソッド、ユースケースの例?

「インターフェイスでのプライベートメソッドのサポートは、Lambda Expressionsのサポートを追加する取り組みの一環としてJava SE 8に含めることを簡単に検討していましたが、 Java SE 8.プライベートインターフェイスメソッドのサポートを引き受けることにより、インターフェイスの非抽象メソッドがコードを共有できるようにすることが提案されています。 "

http://openjdk.Java.net/jeps/21 の仕様とバグレポートで https://bugs.openjdk.Java.net/browse/JDK- 807145

しかし、上記の短い説明があっても、これが必要なユースケースを本当に考えることはできません。 「プライベートインターフェイスメソッド」がコードの点で有用な例をお願いできますか?

EDIT:その答えは、デフォルトの実装がどのようにインターフェイスに追加されたかにより、Java 8、デフォルトの実装が同じコードベースを使用しているインスタンスである。

例えば、

_public interface MyInterface {
     default void initializeMyClass(MyClass myClass, Params params) {
         //do magical things in 100 lines of code to initialize myClass for example
     }

     default MyClass createMyClass(Params params) {
         MyClass myClass = new MyClass();
         initializeMyClass(myClass, params);
         return myClass;
     }

     default MyClass createMyClass() {
         MyClass myClass = new MyClass();
         initializeMyClass(myClass, null);
         return myClass;
     }
}
_

愚かな例、私は知っています。しかし、両方のメソッドでinitializeMyClass(MyClass, Params)を使用したいとしましょう。ただし、このようにすると(デフォルトのメソッド)、initializeMyClass(MyClass, Params)はパブリックインターフェイスの一部になります!それを防ぐために、initializeMyClass(MyClass, Params)全体のコードのみをcreateMyClass()のデフォルトメソッド内に保持できます。その結果、コードが重複しますが、これは望ましくありません。

したがって、これはリファクタリングで問題を引き起こし、そのようなコードの重複を削除するために、プライベートなデフォルトメソッドが許可されます。

回答ありがとうございます!

31
EpicPandaForce

インターフェイスに デフォルトメソッド を指定できるようになりました。これらは、変更されたインターフェイスを実装するすべてのクラスを壊すことなく、新しいメソッドをインターフェイスに追加できるように追加されました。

コードを共有するために2つのデフォルトメソッドが必要な場合、プライベートインターフェイスメソッドはそれを可能にしますが、そのプライベートメソッドとそのすべての「実装の詳細」をインターフェイス経由で公開しません。

32
mk.

なぜ単純ではない(単純にJava8を使用):

PS:プライベートヘルパーのため、Javaでは不可能です。

public interface MyInterface {
 private static class Helper{
     static initializeMyClass(MyClass myClass, Params params){
         //do magical things in 100 lines of code to initialize myClass for example
     }
 }

 default MyClass createMyClass(Params params) {
     MyClass myClass = new MyClass();
     Helper.initializeMyClass(myClass, params);
     return myClass;
 }

 default MyClass createMyClass() {
     MyClass myClass = new MyClass();
     Helper.initializeMyClass(myClass, null);
     return myClass;
 }
}
6
maxim_ge

Java 9では、インターフェイス内でプライベートメソッドを宣言できます。以下に例を示します。

interface myinterface {
    default void m1(String msg){
        msg+=" from m1";
        printMessage(msg);
    }
    default void m2(String msg){
        msg+=" from m2";
        printMessage(msg);
    }
    private void printMessage(String msg){
        System.out.println(msg);
    }
}
public class privatemethods implements myinterface {
    public void printInterface(){
        m1("Hello world");
        m2("new world");
    }
    public static void main(String[] args){
        privatemethods s = new privatemethods();
        s.printInterface();
    }
}

そのためには、jdkをバージョン1.9まで更新する必要があります。

3
Dhiral Kaniya