簡體   English   中英

單例的Java功能接口為枚舉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM