【发布时间】:2015-05-16 10:36:35
【问题描述】:
“对于接口中的私有方法的支持曾一度考虑包含在 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() 默认方法中。这会导致代码重复,这是不可取的。
因此,这会导致重构出现问题,为了消除这种代码重复,允许使用私有默认方法。
感谢您的回答!
【问题讨论】:
标签: java interface private java-9