首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >私人接口方法,用例用例?

私人接口方法,用例用例?
EN

Stack Overflow用户
提问于 2015-03-13 19:51:25
回答 3查看 14.6K关注 0票数 41

“作为增加对Lambda表达式的支持的一部分,在Java SE 8中简要考虑了对接口中私有方法的支持,但为了更好地关注Java SE 8的更高优先级任务,取消了它。现在建议支持私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码。”

http://openjdk.java.net/jeps/213的规范是这样说的,在bug report https://bugs.openjdk.java.net/browse/JDK-8071453中也是如此。

但我真的想不出任何必要的用例,即使上面给出了简短的解释。我可以问一个“私有接口方法”在代码方面有用的例子吗?

编辑:因此答案是,由于默认实现是如何添加到Java8中的接口中的,因此可能存在默认实现使用相同代码基的实例。

例如,

代码语言:javascript
复制
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()默认方法中。导致代码重复,这是不可取的。

因此,这会导致重构问题,并且为了消除这种代码复制,允许使用私有的默认方法。

谢谢你的回答!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-13 19:56:33

接口现在可以有default methods了。添加了这些方法,这样就可以将新方法添加到接口中,而不会破坏实现这些更改接口的所有类。

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

票数 39
EN

Stack Overflow用户

发布于 2017-06-02 16:50:29

为什么不简单地(简单地=使用Java8):

PS:因为私有助手在Java中是不可能的

代码语言:javascript
复制
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;
 }
}
票数 6
EN

Stack Overflow用户

发布于 2018-02-04 06:16:59

Java 9允许在接口中声明私有方法。这就是它的例子。

代码语言:javascript
复制
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版本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29040821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档