毋庸置疑,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主要分析的仍是裝飾器的使用對象