支持专用接口方法
Java 9支持专用接口方法。
此支持允许interface
非抽象方法在它们之间共享代码。 私有方法可以是静态的或实例的。
接口的私有方法可以是abstract
还是default
?
我可以问一个例子,“ private static
接口方法”在代码方面是否有用?
不 ,接口中的私有方法应该被设计用于在interface
实现内部的一段代码中进行分组。 由于这些属于实现(由主体组成)而不是声明,因此在定义时既不能是default
也不是abstract
。
private
方法是static
方法或使用private
关键字声明的非默认实例方法。 您不能将default
方法声明为private
方法,因为default
方法可以从实现其声明接口的类中调用。
private static
方法在定义其实现时从接口的static
方法中抽象出一段代码是很有用的。
接口中的私有静态方法的示例可以如下。 考虑一个对象,StackOverflow上的Question.java
定义为:
class Question { int votes; long created; }
和一个接口,提出按function排序,如StackOverflowTag
上列出的问题所示:
public interface StackOverflowTag { static List sortByNewest(List questions) { return sortBy("NEWEST", questions); } static List sortByVotes(List questions) { return sortBy("VOTE", questions); } //... other sortBy methods private static List sortBy(String sortByType, List questions) { if (sortByType.equals("VOTE")) { // sort by votes } if (sortByType.equals("NEWEST")) { // sort using the created timestamp } return questions; } }
这里接口的private static
方法sortBy
在内部实现基于sortOrderType
的排序,该接口通过接口的两个公共静态方法共享实现, StackOverflowTagConsumer
可以进一步使用这些方法,只需访问这些接口静态方法:
public class StackOverFlowTagConsumer { public static void main(String[] args) { List 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 currentQuestions) { System.out.println(StackOverflowTag.sortByNewest(currentQuestions)); } private static void displaySortedByNewest(List currentQuestions) { System.out.println(StackOverflowTag.sortByNewest(currentQuestions)); } }
存在接口方法的default
关键字,因为对于接口方法,如果没有其他修饰符与之相矛盾,则隐式假设为abstract
。 在Java 8之前,这适用于所有接口方法,这些方法总是被认为是abstract
。
由于static
或private
的存在已经暗示它不能是abstract
(也适用于普通类),因此不需要添加default
修饰符,因此Java排除了这种组合。 要求这种组合也没有意义,因为default
只是意味着该方法在技术上不是abstract
,所以将它添加到已经不是abstract
方法不会改变任何东西。
另一方面,由于需要default
关键字来声明它们不是abstract
的唯一方法是public
实例方法,因此default
关键字仅适用于可覆盖的方法,这些方法可以方便地匹配单词“default”的字面含义。
当这些常见操作不应该直接从接口外部调用时, private
方法对于为接口的public
非abstract
方法提供公共操作很有用,就像普通类中的private
方法一样,而且它们存在于Java中8已经在字节代码级别,因为default
和static
方法可能包含lambda表达式,这些表达式被编译成合成private
方法,所以没有技术上的理由拒绝Java编程语言的这个特性。
不,这三种组合是互斥的。 接口方法不能同时:
- 默认和抽象(因为
default
意味着与abstract
相反) - 默认和私有(因为您无法覆盖私有方法)
- 抽象和私有(因为你不能覆盖私有方法)