有沒有辦法創建一個實現比較器的類,並且只允許創建一個單例實例,或者每個參數化類型只失敗一個實例?Java通用比較器單例
我嘗試了一些機制(都使用私有構造函數,然後getInstance方法),但都沒有有效的語法。所以我想知道是否類型擦除意味着不可能依賴泛型Comparator類的單個實例。
其目的是爲了避免有幾十個類的實例,因爲所有的行爲都是相同的,所以唯一的例子似乎是可取的。可能嗎?如果沒有,建議如何避免比較器實例的大量複製?
編輯:這個問題似乎引起了我想要實現的困惑,所以我會在這裏粘貼一個我的破解企圖。下面的代碼試圖創建一個僅包含每個類型T的比較器的單個實例的Map。這是有效的語法,但我無法調用getInstance
方法,因爲我無法獲取Class<T>
實例客戶端代碼。
final class IntervalComparator<T extends Comparable<T>> implements
Comparator<Interval<T>> {
// Private constructor. Use the getInstance method instead.
private IntervalComparator() {
}
// Map to hold one instance for each type.
private static Map<Class, IntervalComparator> cacheMap = new HashMap<>();
// The only method which returns an instance of this Comparator.
public static <K extends Comparable<K>> IntervalComparator<K>
getInstance(Class<K> type) {
IntervalComparator<K> soleInstance = cacheMap.get(type);
if(soleInstance == null) {
soleInstance = new IntervalComparator<>();
cacheMap.put(type, soleInstance);
}
return soleInstance;
}
@Override
public int compare(Interval<T> o1, Interval<T> o2) {
// ... Comparison code goes here ...
}
}
客戶端代碼如下所示:
private Set<Interval<T>> intervalSet;
private IntervalUnion(IntervalUnion.Builder<T> builder) {
this.intervalSet = new TreeSet<>(new IntervalComparator<T>());
// ... add Interval<T> objects into intervalSet ...
}
目前它正在創建每次調用時間new IntervalComparator<T>
對象,我不認爲有任何的方式來傳遞Class<T>
到getInstance
方法。
向我們展示你的代碼。 – SLaks
你如何調用'getInstance()'方法?爲什麼你不能傳遞'Class'實例? –
由於客戶端代碼也是參數化的,所以我沒有具體的類型傳遞給getInstance方法。 – Bobulous