[英]Singleton of Java functional interface as enum
在查看Comparators類的源代碼時,我遇到了這些代碼行。
class Comparators {
//...
enum NaturalOrderComparator implements Comparator<Comparable<Object>> {
INSTANCE;
@Override
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
return c1.compareTo(c2);
}
@Override
public Comparator<Comparable<Object>> reversed() {
return Comparator.reverseOrder();
}
}
//...
}
我想我明白這是做什么的。 它是一個實現Comparator接口的Singleton實例。 它使用實現Comparable接口的類的“compareTo”進行自然排序(如果我錯了,請糾正我)。
然而,我不明白為什么使用枚舉完成它。 我真的很喜歡Singletons的枚舉,不要誤會我的意思但在這種情況下我個人認為這會更簡單:
public static final Comparator<Comparable<Object>> NATURAL_ORDER_COMPARATOR =
new Comparator<Comparable<Object>>() {
@Override
public int compare(Comparable<Object> c1, Comparable<Object> c2) {
return c1.compareTo(c2);
}
//...
}
除了個人偏好之外,還有任何理由使用枚舉來實現嗎?
這可能是由於Serializable
。
根據您的方法,如果您創建一個包含Comparators.NATURAL_ORDER_COMPARATOR
的對象,當您寫入該對象並將其讀回時,將創建一個新的NATURAL_ORDER_COMPARATOR
。 由於對象成本太小,因此打破了單例 。
一些證據就是Collections.ReverseComparator
。 它使用您的方法:
static final ReverseComparator REVERSE_ORDER = new ReverseComparator();
但缺點是必須存在以下代碼才能維護單例
private Object readResolve() { return Collections.reverseOrder(); }
現在哪一個更容易? 就個人而言,我更喜歡使用'enum singleton'模式作為我的首選。
這正是第89項中的要點:對於實例控制,實際上更喜歡枚舉類型來自Effective Java的readResolve ,它與Serialization
。
維護readResolve
而不是枚舉實例要復雜得多且繁瑣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.