我们一直在使用Google的Guava库做更多的事情-多么出色的库! 我们用于它的最新内容是为我们的域对象整理比较器。 就是这样。 使用Apache Isis的JDO Objectstore ,使您的类实现java.lang.Comparable
,并对集合使用SortedSet
是一个好习惯。 您可以在Isis的quickstart原型中看到这一点,其中ToDoItem
具有递归关系:
public class ToDoItem implements Comparable<ToDoItem> {...private SortedSet<ToDoItem> dependencies = Sets.newTreeSet();...
}
但是,如何最好地实现compareTo
方法? 这是原始的实现:
public int compareTo(final ToDoItem other) {if (isComplete() && !other.isComplete()) {return +1;}if (!isComplete() && other.isComplete()) {return -1;}if (getDueBy() == null && other.getDueBy() != null) {return +1;}if (getDueBy() != null && other.getDueBy() == null) {return -1;}if (getDueBy() == null && other.getDueBy() == null ||getDueBy().equals(this.getDueBy())) {return getDescription().compareTo(other.getDescription());}return getDueBy().compareTo(getDueBy());}
k! 基本上说:
*在尚未完成的对象之前订购尚未完成的对象
*如果有平局,请按截止日期排序(最后将没有截止日期的那些放在最后) *如果有领带,请按描述排序。
这是使用Guava的Ordering
类重写的方法。 首先,让我们为标量类型创建一些Ordering
实例:
public final class Orderings {public static final Ordering<Boolean> BOOLEAN_NULLS_LAST = Ordering.<Boolean>natural().nullsLast();public static final Ordering<LocalDate> LOCAL_DATE_NULLS_LAST = Ordering.<LocalDate>natural().nullsLast();public static final Ordering<String> STRING_NULLS_LAST = Ordering.<String>natural().nullsLast();private Orderings(){}
}
现在,我们可以以声明方式重写ToDoItem
的compareTo()
方法:
public class ToDoItem implements Comparable {...public int compareTo(ToDoItem o) {return ORDERING_BY_COMPLETE.compound(ORDERING_BY_DUE_BY).compound(ORDERING_BY_DESCRIPTION).compare(this, o);}public static Ordering<ToDoItem> ORDERING_BY_COMPLETE = new Ordering<ToDoItem>(){public int compare(ToDoItem p, ToDoItem q) {return Orderings.BOOLEAN_NULLS_LAST.compare(p.isComplete(), q.isComplete());}};public static Ordering<ToDoItem> ORDERING_BY_DUE_BY = new Ordering()<ToDoItem>{public int compare(ToDoItem p, ToDoItem q) {return Orderings.BOOLEAN_NULLS_LAST.compare(p.getDueBy(), q.getDueBy());}};public static Ordering<ToDoItem> ORDERING_BY_DESCRIPTION = new Ordering()<ToDoItem>{public int compare(ToDoItem p, ToDoItem q) {return Orderings.STRINGS_NULLS_LAST.compare(p.getDescription(), q.getDescription());}};
现在,诚然,这几乎不能保证在单个类中仅使用一个方法就可以拥有所有样板。 当然不是! 但是,我们现在拥有的是一个小代数,可以用来在域模型中的所有域类之间进行组合。 使用ToDoItem
其他域类可以使用ToDoItem
的自然排序(从Ordering.natural()
访问)进行Ordering.natural()
,也可以使用各种ToDoItem.ORDERING_BY_xxx
排序来创建新的排序。
参考: Dan Haywood博客博客中使用了我们的JCG合作伙伴 Dan Haywood的Google Guava的Ordering API 。
翻译自: https://www.javacodegeeks.com/2013/02/using-google-guavas-ordering-api.html