16

考虑一个简单的类:

class Employee {

String name;
int sal;

....//getters and setters
}

例如,我可以创建一个比较器来对字段名称进行排序。

class EmpSortByName implements Comparator<Employee>{

 @Override
 public int compare(Employee e1, Employee e2){
  return e1.getName().compareTo(e2.getName());
 }
}

但是,查看 apache commons BeanComparator,可以通过以下方式实现排序:

BeanComparator bc = new BeanComparator("name");
Collections.sort(employeeList, bc);

因此,通过使用 BeanComparator,我可以用最少的代码实现排序。使用 Comparators 和 BeanComparators 之间的权衡是什么:在性能、使用场景(多字段排序、其他因素)方面?

我也知道要使用 BeanComparator,必须导入 beanutils jar。

4

2 回答 2

22

BeanComparator 使用反射来访问 name 属性并比较两个对象。尽管反射性能有所提高,但仍不如直接访问字段快。这是否重要取决于在您的应用程序中调用它的次数以及在何种上下文中。

另一个问题是,如果您重构方法并将其重命名为getLastName(),则使用 BeanComparator 的代码将不会被重构,并且直到运行时(或单元测试时)才会注意到该问题。

坦率地说,实现比较器非常简单,我认为使用反射不是一个好主意。避免 4 行琐碎代码的好处不足以弥补它引起的性能和可维护性问题。

于 2012-07-11T21:24:35.950 回答
3

同样使用 beancomparator,您可以使用 compareTuple 轻松比较多个属性 org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple); Collections.sort(List,beanComparator);

于 2013-01-17T06:20:01.143 回答