Comparator vs Apache BeanComparator

考虑一个简单的类:

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,我可以用最少的代码实现排序。使用比较器和BeanComparators之间的权衡是什么:在性能,使用场景(多个字段排序,其他因素)方面?

我也明白,要使用BeanComparator,必须导入beanutils jar。


答案 1

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

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

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


答案 2

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


推荐