支持私有接口方法
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));
}
}
不,这三种组合是互斥的。接口方法不能同时为:
- 默认和抽象(因为
default
与abstract
相反)
- 默认和私有(因为你不能覆盖私有方法)
- 抽象和私有(因为你不能覆盖私有方法)
存在用于接口方法的 default
关键字,因为对于接口方法,如果没有其他修饰符与之相矛盾,则隐式假定 abstract
。在 Java 8 之前,这适用于 所有 接口方法,这些方法始终被视为 abstract
.
因为 static
或 private
中的任何一个的存在都意味着它不能是 abstract
(这也适用于普通的 类),所以有无需添加 default
修饰符,因此 Java 排除了这种组合。并且要求这种组合也没有意义,因为 default
仅仅暗示该方法不是 abstract
,从技术上讲,所以将它添加到已经不是 abstract
的方法中不会'什么都改变不了。
另一方面,由于唯一需要 default
关键字来声明它们不是 abstract
的方法是 public
实例方法,因此 default
关键字仅适用于可重写的方法,这与“默认”一词的字面意思很方便。
private
方法可用于为接口的 public
非 abstract
方法提供常用操作,而这些常用操作不应从接口的外部调用直接接口,很像普通 类 中的 private
方法,此外,它们在 Java 8 中已经存在于字节码级别,如 default
和 static
方法可能包含编译成合成 private
方法的 lambda 表达式,因此没有技术理由拒绝 Java 编程语言的该功能。
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));
}
}
不,这三种组合是互斥的。接口方法不能同时为:
- 默认和抽象(因为
default
与abstract
相反) - 默认和私有(因为你不能覆盖私有方法)
- 抽象和私有(因为你不能覆盖私有方法)
存在用于接口方法的 default
关键字,因为对于接口方法,如果没有其他修饰符与之相矛盾,则隐式假定 abstract
。在 Java 8 之前,这适用于 所有 接口方法,这些方法始终被视为 abstract
.
因为 static
或 private
中的任何一个的存在都意味着它不能是 abstract
(这也适用于普通的 类),所以有无需添加 default
修饰符,因此 Java 排除了这种组合。并且要求这种组合也没有意义,因为 default
仅仅暗示该方法不是 abstract
,从技术上讲,所以将它添加到已经不是 abstract
的方法中不会'什么都改变不了。
另一方面,由于唯一需要 default
关键字来声明它们不是 abstract
的方法是 public
实例方法,因此 default
关键字仅适用于可重写的方法,这与“默认”一词的字面意思很方便。
private
方法可用于为接口的 public
非 abstract
方法提供常用操作,而这些常用操作不应从接口的外部调用直接接口,很像普通 类 中的 private
方法,此外,它们在 Java 8 中已经存在于字节码级别,如 default
和 static
方法可能包含编译成合成 private
方法的 lambda 表达式,因此没有技术理由拒绝 Java 编程语言的该功能。