比较器与Apache BeanComparator

ace*_*es. 14 java apache comparison performance comparator

考虑一个简单的类:

class Employee {

String name;
int sal;

....//getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个Comparator来对字段名称进行排序.

class EmpSortByName implements Comparator<Employee>{

 @Override
 public int compare(Employee e1, Employee e2){
  return e1.getName().compareTo(e2.getName());
 }
}
Run Code Online (Sandbox Code Playgroud)

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

BeanComparator bc = new BeanComparator("name");
Collections.sort(employeeList, bc);
Run Code Online (Sandbox Code Playgroud)

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

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

JB *_*zet 20

BeanComparator使用反射来访问name属性并比较这两个对象.虽然反射性能有所提高,但仍然没有直接访问字段那么快.这是否重要取决于您在应用程序中调用的次数以及在哪种情况下.

另一个问题是,如果你重构方法,并改名为getLastName(),使用BeanComparator的代码不会被重构,问题会被忽视,直到运行时(或单元测试时间).

坦率地说,实现一个比较器是如此简单,我不认为使用反射是一个好主意.避免4行简单代码的好处不足以弥补它导致的性能和可维护性问题.

  • 我自己从来没有需要自己使用它,但我可以想象在单元测试中使用它,或者当UI允许动态选择必须对哪些属性对象进行排序时,或者在像adstag这样的JSP标记中,它必须比较bean甚至不知道他们的类型,而不需要开发人员提供比较器 (3认同)