Guava源碼分析——Ordering

毋庸置疑,Ordering確定實現了Comparator<T>接口,這是Java中比較排序使用的。而其中的靜態方法返回一種類型的Ordering,不一樣的Ordering子類實現各自的compare()方法,以下所示:安全

public static <C extends Comparable> Ordering<C> natural() {
  return (Ordering<C>) NaturalOrdering.INSTANCE;
}

實現類有以下:ide

若是Ordering的子類構造時不須要參數,只是用final static INSTANCE的方法構造爲單例,因爲沒有共享的成員變量,因此線程安全。this

裝飾模式在其中使用的爐火純青。舉個例子驗證一下:spa

List<Integer> numbers = Lists.newArrayList(null, 1, 3, 2, 5, 4, 6);
List<Integer> sorted = Ordering.natural().nullsFirst().sortedCopy(numbers);
for (Integer integer : sorted) {
  System.out.println(integer);
}

Ordering.natural()返回NaturalOrdering.INSTANCE對象,而後調用nullFirst()後,會return new NullsFirstOrdering<S>(this);此時的this爲NaturalOrdering.INSTANCE對象,而NullsFirstOrdering構造方法聚合Ordering父類,在重寫compare()方法時,加入null排序邏輯後,進行後裝飾。線程

@Override 
public int compare(@Nullable T left, @Nullable T right) {   if (left == right) { return 0; } if (left == null) {    return RIGHT_IS_GREATER; } if (right == null) { return LEFT_IS_GREATER; } return ordering.compare(left, right); }

最後Ordering父類中封裝的方式sortedCopy(),在調用 Arrays.sort(array, this)方法,以裝飾後的Ordering做爲Comparator傳入sort()方法,從而完美的實現chain形式的書寫方式和調用規則。code

其餘排序方式的實現就不一一說明了。Ordering主要分析的仍是裝飾器的使用對象

相關文章
相關標籤/搜索