繁体   English   中英

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

[英]Private interface methods, example use-case?

“对接口中私有方法的支持曾被简要考虑过包含在 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()默认方法中。 这会导致代码重复,这是不可取的。

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

谢谢回答!

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

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

为什么不简单(简单地=使用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 版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM