私有接口方法,示例用例?
Private interface methods, example use-case?
"Support for private methods in interfaces was briefly in consideration for inclusion in Java SE 8 as part of the effort to add support for Lambda Expressions, but was withdrawn to enable better focus on higher priority tasks for Java SE 8. It is now proposed that support for private interface methods be undertaken thereby enabling non abstract methods of an interface to share code between them."
http://openjdk.java.net/jeps/213 and says in bug report https://bugs.openjdk.java.net/browse/JDK-8071453 的规范如是说。
但我真的想不出有必要这样做的任何用例,即使上面给出了简短的解释。我可以问一个 "private interface methods" 在代码方面有用的例子吗?
编辑: 所以答案是,由于在 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)
将成为 public 接口的一部分!为了防止这种情况发生,我们只能将整个 initializeMyClass(MyClass, Params)
的代码保留在 createMyClass()
默认方法中。这会导致代码重复,这是不可取的。
因此,这会导致重构问题,要删除此类代码重复,允许私有默认方法。
感谢您的回答!
接口现在可以有 default methods。添加这些是为了可以将新方法添加到接口中,而不会破坏实现这些已更改接口的所有 类。
如果两个默认方法需要共享代码,私有接口方法将允许它们这样做,但不会通过接口公开该私有方法及其所有 "implementation details"。
为什么不简单地(简单地=使用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 版本。
"Support for private methods in interfaces was briefly in consideration for inclusion in Java SE 8 as part of the effort to add support for Lambda Expressions, but was withdrawn to enable better focus on higher priority tasks for Java SE 8. It is now proposed that support for private interface methods be undertaken thereby enabling non abstract methods of an interface to share code between them."
http://openjdk.java.net/jeps/213 and says in bug report https://bugs.openjdk.java.net/browse/JDK-8071453 的规范如是说。
但我真的想不出有必要这样做的任何用例,即使上面给出了简短的解释。我可以问一个 "private interface methods" 在代码方面有用的例子吗?
编辑: 所以答案是,由于在 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)
将成为 public 接口的一部分!为了防止这种情况发生,我们只能将整个 initializeMyClass(MyClass, Params)
的代码保留在 createMyClass()
默认方法中。这会导致代码重复,这是不可取的。
因此,这会导致重构问题,要删除此类代码重复,允许私有默认方法。
感谢您的回答!
接口现在可以有 default methods。添加这些是为了可以将新方法添加到接口中,而不会破坏实现这些已更改接口的所有 类。
如果两个默认方法需要共享代码,私有接口方法将允许它们这样做,但不会通过接口公开该私有方法及其所有 "implementation details"。
为什么不简单地(简单地=使用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 版本。