“作为增加对Lambda表达式的支持的一部分,在Java SE 8中简要考虑了对接口中私有方法的支持,但为了更好地关注Java SE 8的更高优先级任务,取消了它。现在建议支持私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码。”
http://openjdk.java.net/jeps/213的规范是这样说的,在bug report https://bugs.openjdk.java.net/browse/JDK-8071453中也是如此。
但我真的想不出任何必要的用例,即使上面给出了简短的解释。我可以问一个“私有接口方法”在代码方面有用的例子吗?
编辑:因此答案是,由于默认实现是如何添加到Java8中的接口中的,因此可能存在默认实现使用相同代码基的实例。
例如,
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()默认方法中。导致代码重复,这是不可取的。
因此,这会导致重构问题,并且为了消除这种代码复制,允许使用私有的默认方法。
谢谢你的回答!
发布于 2015-03-13 19:56:33
接口现在可以有default methods了。添加了这些方法,这样就可以将新方法添加到接口中,而不会破坏实现这些更改接口的所有类。
如果两个默认方法需要共享代码,则私有接口方法将允许它们这样做,但不会通过接口公开该私有方法及其所有“实现细节”。
发布于 2017-06-02 16:50:29
为什么不简单地(简单地=使用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;
}
}发布于 2018-02-04 06:16:59
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版本。
https://stackoverflow.com/questions/29040821
复制相似问题