[英]Private interface methods, example use-case?
“对接口中私有方法的支持曾被简要考虑过包含在 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()
默认方法中。 这会导致代码重复,这是不可取的。
因此,这会导致重构出现问题,并且为了删除此类代码重复,允许使用私有默认方法。
谢谢回答!
接口现在可以有默认方法。 添加这些是为了可以将新方法添加到接口中,而不会破坏实现这些更改接口的所有类。
如果两个默认方法需要共享代码,私有接口方法将允许它们这样做,但不会通过接口公开该私有方法及其所有“实现细节”。
为什么不简单(简单地=使用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;
}
}
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 版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.