支持私有接口方法

Private interface methods are supported

Private interface methods are supported by Java 9.

此支持允许 interface 的非抽象方法在它们之间共享代码。私有方法可以是静态的或实例的。

接口的私有方法可以是abstract还是default

请问“private static 接口方法”在代码方面有用的例子吗?

No,接口中的私有方法被认为是为俱乐部内部的一段代码而设计的 interface 实施。由于这些属于实现(由主体组成)而不是声明,因此在定义时既不能是 default 也不能是 abstract

private 方法是 static 方法或使用 private 关键字声明的非默认实例方法。您不能将 default 方法也声明为 private,因为 default 方法旨在可从实现其声明接口的 类 中调用。


private static 方法可用于在定义其实现时从接口的 static 方法中抽象出一段通用代码。

接口中的私有静态方法示例如下。考虑一个对象,Question.java 在 Whosebug 上定义为:

class Question {
    int votes;
    long created;
}

以及一个界面,该界面建议按 WhosebugTag 上列出的问题中所见的功能进行排序:

public interface WhosebugTag {

    static List<Question> sortByNewest(List<Question> questions) {
        return sortBy("NEWEST", questions);
    }

    static List<Question> sortByVotes(List<Question> questions) {
        return sortBy("VOTE", questions);
    }

    //... other sortBy methods

    private static List<Question> sortBy(String sortByType, List<Question> questions) {
        if (sortByType.equals("VOTE")) {
            // sort by votes
        }
        if (sortByType.equals("NEWEST")) {
            // sort using the created timestamp
        }
        return questions;
    }
}

这里接口的private static方法sortBy内部实现了基于sortOrderType的排序与接口​​的两个public静态方法共享实现,可以被 WhosebugTagConsumer 进一步消耗可以简单地访问这些接口静态方法:

public class WhosebugTagConsumer {

    public static void main(String[] args) {
        List<Question> currentQuestions = new ArrayList<>();

        // if some action to sort by votes
        displaySortedByVotes(currentQuestions);

        // if another action to sort by newest
        displaySortedByNewest(currentQuestions);
    }

    private static void displaySortedByVotes(List<Question> currentQuestions) {
        System.out.println(WhosebugTag.sortByVotes(currentQuestions));
    }

    private static void displaySortedByNewest(List<Question> currentQuestions) {
        System.out.println(WhosebugTag.sortByNewest(currentQuestions));
    }
}

不,这三种组合是互斥的。接口方法不能同时为:

  • 默认和抽象(因为defaultabstract相反)
  • 默认和私有(因为你不能覆盖私有方法)
  • 抽象和私有(因为你不能覆盖私有方法)

存在用于接口方法的 default 关键字,因为对于接口方法,如果没有其他修饰符与之相矛盾,则隐式假定 abstract。在 Java 8 之前,这适用于 所有 接口方法,这些方法始终被视为 abstract.

因为 staticprivate 中的任何一个的存在都意味着它不能是 abstract(这也适用于普通的 类),所以有无需添加 default 修饰符,因此 Java 排除了这种组合。并且要求这种组合也没有意义,因为 default 仅仅暗示该方法不是 abstract,从技术上讲,所以将它添加到已经不是 abstract 的方法中不会'什么都改变不了。

另一方面,由于唯一需要 default 关键字来声明它们不是 abstract 的方法是 public 实例方法,因此 default 关键字仅适用于可重写的方法,这与“默认”一词的字面意思很方便。

private 方法可用于为接口的 publicabstract 方法提供常用操作,而这些常用操作不应从接口的外部调用直接接口,很像普通 类 中的 private 方法,此外,它们在 Java 8 中已经存在于字节码级别,如 defaultstatic 方法可能包含编译成合成 private 方法的 lambda 表达式,因此没有技术理由拒绝 Java 编程语言的该功能。