「インターフェイスでのプライベートメソッドのサポートは、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()
のデフォルトメソッド内に保持できます。その結果、コードが重複しますが、これは望ましくありません。
したがって、これはリファクタリングで問題を引き起こし、そのようなコードの重複を削除するために、プライベートなデフォルトメソッドが許可されます。
回答ありがとうございます!
インターフェイスに デフォルトメソッド を指定できるようになりました。これらは、変更されたインターフェイスを実装するすべてのクラスを壊すことなく、新しいメソッドをインターフェイスに追加できるように追加されました。
コードを共有するために2つのデフォルトメソッドが必要な場合、プライベートインターフェイスメソッドはそれを可能にしますが、そのプライベートメソッドとそのすべての「実装の詳細」をインターフェイス経由で公開しません。
なぜ単純ではない(単純に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;
}
}
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まで更新する必要があります。