40

「インターフェイスでのプライベート メソッドのサポートは、ラムダ式のサポートを追加する取り組みの一環として、Java SE 8 に含めることを一時的に検討していましたが、Java SE 8 のより優先度の高いタスクにより集中できるようにするために撤回されました。現在、それが提案されています。プライベート インターフェイス メソッドのサポートが行われるため、インターフェイスの非抽象メソッドがそれらの間でコードを共有できるようになります。」

http://openjdk.java.net/jeps/213の仕様 と、バグレポートhttps://bugs.openjdk.java.net/browse/JDK-8071453に記載されています。

しかし、上記の簡単な説明があっても、これが必要なユースケースは本当に思いつきません。コードに関して「プライベート インターフェイス メソッド」が役立つ例を教えてください。

編集:したがって、答えは、デフォルトの実装が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()その結果、コードの重複が発生しますが、これは望ましくありません。

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

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

4

3 に答える 3