支持专用接口方法

时间:2017-09-14 12:08:34

标签: java interface java-9 private-methods

Private interface methods are supported by Java 9.

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

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

我可以问一个例子" private static接口方法"在代码方面有用吗?

3 个答案:

答案 0 :(得分:3)

,接口中的私有方法应该设计用于在interface实现内部的一段代码中进行分组。由于这些属于实现(由正文组成)而不是声明,因此在定义时既不能default也不能abstract

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

private static方法在定义其实现时从接口的static方法中抽象出一段共同的代码非常有用。

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

class Question {
    int votes;
    long created;
}

以及建议按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;
    }
}

此处接口的private static方法sortBy在内部实现基于sortOrderType的排序,该接口通过接口的两个公共静态方法共享实现,可以进一步使用{ {3}}可以简单地访问这些接口静态方法:

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));
    }
}

答案 1 :(得分:3)

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

由于存在staticprivate,已经暗示它不能是abstract(也适用于普通类),因此无需添加{ {1}}修饰符因此,Java排除了这种组合。要求这种组合也没有意义,因为default仅仅意味着该方法不是default,技术上,因此将其添加到已经不是abstract的方法中改变任何事情。

另一方面,由于需要abstract关键字来声明它们不是default的唯一方法是abstract实例方法,因此public关键字仅适用to overridable方法,方便地匹配单词“default”的字面含义。

当不应该直接从接口外部调用这些常见操作时,

default方法可用于为接口的privatepublic方法提供常见操作。 ,就像普通类中的abstract方法一样,它们已经存在于字典代码级别的Java 8中,因为privatedefault方法可能包含lambda表达式,这些表达式被编译为合成{ {1}}方法,因此没有技术理由否认Java编程语言的这一特性。

答案 2 :(得分:1)

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

  • 默认和抽象(因为default表示与abstract
  • 相反
  • 默认和私有(因为您无法覆盖私有方法)
  • 抽象和私有(因为你不能覆盖私有方法)