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

2022-09-01 03:15:32

“作为添加对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;
     }
}

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

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

感谢您的回答!


答案 1

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

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


答案 2

为什么不简单地(简单地=使用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;
 }
}