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