40

“对接口中私有方法的支持曾一度考虑包含在 Java SE 8 中,作为增加对 Lambda 表达式支持的努力的一部分,但为了更好地专注于 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

39

接口现在可以有默认方法。添加这些是为了可以将新方法添加到接口中,而不会破坏实现这些更改的接口的所有类。

如果两个默认方法需要共享代码,私有接口方法将允许它们这样做,但不会通过接口公开该私有方法及其所有“实现细节”。

于 2015-03-13T19:56:33.430 回答
6

为什么不简单地(简单地 = 使用 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;
 }
}
于 2017-06-02T16:50:29.877 回答
4

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 版本。

于 2018-02-04T06:16:59.470 回答