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

Epi*_*rce 33 java private interface java-9

"作为添加对Lambda表达式的支持的努力的一部分,简单地考虑将接口中的私有方法支持包含在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;
     }
}
Run Code Online (Sandbox Code Playgroud)

愚蠢的例子,我知道.但是,让我们说我们想要initializeMyClass(MyClass, Params)在两种方法中使用.但是,如果我们这样做(默认方法),那么initializeMyClass(MyClass, Params)将成为公共接口的一部分!为了防止这种情况发生,我们只能将整个代码保留initializeMyClass(MyClass, Params)createMyClass()默认方法中.这导致代码重复,这是不合需要的.

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

谢谢回答!

mk.*_*mk. 34

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

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

  • 这样压倒一切的工作怎么样?什么可以覆盖访问,什么可以访问覆盖? (4认同)
  • 我现在意识到你可能在谈论私有接口方法,而我假设我们正在讨论默认方法:)我不知道私有方法将如何实现,但我不认为他们使用静态方法,因为您经常要使用其他实例方法来计算结果.也许这值得提出自己的问题...... (3认同)
  • 那么,为什么不使用抽象类呢?想说:界面不是太多了吗?我看到一个接口作为契约,而不是作为一个实现,我接受lambdas的默认方法,但我认为这是失控的......他们应该允许多重继承并停止它. (3认同)
  • 这样的方法是否基本上是语法糖来调用静态方法,否则这些方法可能是程序包私有的? (2认同)

max*_*_ge 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;
 }
}
Run Code Online (Sandbox Code Playgroud)