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

Java 私有接口方法,示例用例?,java,interface,private,java-9,Java,Interface,Private,Java 9,“作为增加对Lambda表达式支持的努力的一部分,Java SE 8中曾短暂考虑过对接口中私有方法的支持,但为了更好地关注Java SE 8的更高优先级任务,该支持被撤回。现在建议支持私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码。” 缺陷报告中的规范和说明如是说 但是,即使上面给出了简短的解释,我也无法真正想到任何需要这样做的用例。我可以问一个“私有接口方法”在代码方面有用的例子吗 编辑:因此答案是,由于Java 8中的接口添加了默认实现,因此可能存在默认实现使用相同代码库的实例

“作为增加对Lambda表达式支持的努力的一部分,Java SE 8中曾短暂考虑过对接口中私有方法的支持,但为了更好地关注Java SE 8的更高优先级任务,该支持被撤回。现在建议支持私有接口方法,从而使接口的非抽象方法能够在它们之间共享代码。”

缺陷报告中的规范和说明如是说

但是,即使上面给出了简短的解释,我也无法真正想到任何需要这样做的用例。我可以问一个“私有接口方法”在代码方面有用的例子吗

编辑:因此答案是,由于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;
 }
}

Java9允许在接口内声明私有方法。 下面是一个例子

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版本。

这些方法基本上是用来调用静态方法的语法糖,否则这些方法可能是包私有的吗?不,因为您可以在实现中将它们作为实例方法重写,如果使用静态方法,这是您无法做到的。这样的重写是如何工作的?会发生什么覆盖访问,以及什么可以访问覆盖?我现在意识到,您可能正在谈论私有接口方法,而我假设我们正在谈论默认方法:)我不知道私有方法将如何实现,但我认为它们不会使用静态方法,因为您经常希望使用其他实例方法来计算结果。也许这值得提出它自己的问题…那么,为什么不使用抽象类呢?想说:对于一个接口来说,它们不是太多的东西吗?我将接口视为一个契约,而不是一个实现,为了lambdas,我接受默认方法,但我认为这是失控的…它们应该允许多个inheri这是一个很好的技巧,可能是因为它稍微不太方便,但这是一个很好的技巧!我在很多年龄段都广泛使用这种助手“。有点奇怪,编程语言是以这种方式扩展的,从我的POV.private静态类中增加了不必要的复杂性。我的eclipse不编译这个类here@maxim_ge我不知道你的编译器如何允许你使用这样的声明!!!但是它不会用我的Java8U131编译,除非我对
Helper
类使用公共或包级别@maxim_ge只有在从类声明中删除私有关键字和静态关键字时,才会编译该类。即使如此,这也与接口中的私有方法不同。您仍然可以通过键入
MyInterface.Helper
来访问
Helper
类。接口中的私有方法是完全隐藏的,无法从接口外部访问。