私有接口方法,例如用例?

时间:2015-03-13 19:51:26

标签: java interface private java-9

“作为添加对Lambda Expressions支持的努力的一部分,简要考虑将接口中的私有方法支持包含在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()默认方法中。这导致代码重复,这是不可取的。

因此,这会导致重构问题,并且要删除此类代码重复,则允许使用私有默认方法。

感谢您的回答!

3 个答案:

答案 0 :(得分:32)

接口现在可以有default methods。添加了这些,以便可以在接口上添加新方法,而不会破坏实现这些已更改接口的所有类。

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

答案 1 :(得分: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;
 }
}

答案 2 :(得分:3)

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