考虑一个简单的类:
class Employee {
String name;
int sal;
....//getters and setters
}
我可以创建一个Comparator来对字段名称进行排序。
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。
答案 0 :(得分:20)
BeanComparator使用反射来访问name属性并比较这两个对象。虽然反射性能有所提高,但仍然没有直接访问字段那么快。这是否重要取决于它在您的应用程序中调用的次数以及在哪种情况下。
另一个问题是,如果你重构方法并将其重命名为getLastName()
,那么使用BeanComparator的代码将不会被重构,并且在运行时(或单元测试时间)之前问题将被忽略。
坦率地说,实现一个比较器是如此简单,我不认为使用反射是一个好主意。避免4行琐碎代码的好处不足以弥补它导致的性能和可维护性问题。
答案 1 :(得分:2)
使用beancomparator,您可以使用compareTuple轻松地比较一个属性
org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple);
Collections.sort(List,beanComparator);