支持专用接口方法

Neh*_*war 4 java interface private-methods java-9

Java 9支持专用接口方法。

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

接口的私有方法可以abstractdefault

请问一个示例,其中“ private static接口方法”在代码方面很有用?

Nam*_*man 5

,应该将接口中的私有方法设计为结合在interface实现内部的一段代码中。由于这些属于实现(由主体组成)而不是声明,因此它既不能是default,也不能abstract在定义时使用。

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


在定义接口的实现时,这些private static方法可用于从static接口的方法中提取通用代码。

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

class Question {
    int votes;
    long created;
}
Run Code Online (Sandbox Code Playgroud)

和一个接口,该接口建议按功能排序,如以下所列问题所示StackOverflowTag

public interface StackOverflowTag {

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此,接口private static方法sortBy基于sortOrderType与两个接口的公共静态方法共享实现,在内部实现排序,a StackOverflowTagConsumer可以进一步使用这些方法,只需访问以下接口静态方法即可:

public class StackOverFlowTagConsumer {

    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(StackOverflowTag.sortByVotes(currentQuestions));
    }

    private static void displaySortedByNewest(List<Question> currentQuestions) {
        System.out.println(StackOverflowTag.sortByNewest(currentQuestions));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不是一个很好的例子。让不同的方法委托给另一个使用条件的方法,该方法使用条件区分这些调用者并根据调用者执行完全不同的代码,这与重用*通用*代码的实际意图完全相反。 (5认同)

Hol*_*ger 5

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

由于任何一个static或或的存在private已经暗示它不能abstract(这也适用于普通类),因此不需要添加default修饰符,因此,Java 排除了这种组合。并且要求这种组合也没有意义,因为default仅仅暗示该方法不是abstract,技术上,因此将它添加到已经不是的方法abstract不会改变任何东西。

另一方面,由于唯一需要default关键字来声明它们不是的方法abstractpublic实例方法,因此default关键字仅适用于可覆盖的方法,这很方便地与“default”一词的字面意思相匹配。

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