Java Comparator与ApacheBeanComparator
考虑一个简单的类:Java Comparator与ApacheBeanComparator,java,performance,apache,comparison,comparator,Java,Performance,Apache,Comparison,Comparator,考虑一个简单的类: 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().compare
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());
}
}
因此,通过使用BeanComparator,我可以用最少的代码实现排序。使用比较器和BeanComparator之间的权衡是什么:在性能、使用场景(多字段排序、其他因素)方面
我还了解到,要使用BeanComparator,必须导入beanutils jar。BeanComparator使用反射来访问name属性并比较这两个对象。虽然反射性能有所提高,但仍然不如直接访问字段那么快。这是否重要取决于在应用程序中调用它的次数以及在哪个上下文中调用 另一个问题是,如果重构该方法并将其重命名为
getLastName()
,则使用BeanComparator的代码将不会被重构,并且直到运行时(或单元测试时)才会注意到该问题
坦白地说,实现一个比较器是如此简单,以至于我认为使用反射不是一个好主意。避免4行琐碎代码的好处不足以弥补它造成的性能和可维护性问题。此外,使用beancomparator,您可以使用compareTuple轻松地比较多个属性
org.ujac.util.BeanComparator BeanComparator=new org.ujac.util.BeanComparator(compareTuple);
Collections.sort(列表、beanComparator)代码>这是一个最小的“明显”代码。别忘了你不知道BeanComparator做什么,而且可能不如第一个way@JB你是对的,由于反射会影响性能。在什么情况下应该使用BeanComparator?“最小”代码是唯一的原因吗?你能想到其他原因吗?我自己从来没有必要使用它,但我可以想象在单元测试中使用它,或者当UI允许动态选择必须对哪些属性对象进行排序时,或者在JSP标记(如displaytag)中使用它,它必须在不知道bean类型的情况下对bean进行比较,而不需要开发人员提供比较器在上述问题的上下文中,我同意这个解决方案,但是如果必须对类的给定字段进行排序,该怎么办呢。若类有太多的字段,那个么我们就不能为每个字段编写一个比较器,所以应该使用BeanComparator。若并没有反射和泛型过滤,我们的JSF,Hibernate企业应用程序将有一个更大的代码库,需要使用无休止的特定DAO、转换器、比较器和过滤器来维护。重命名参数是有效的,但我们希望有一天所有第三方库都会支持JavaLambda,使其过时。在C#stack中,无需字符串bean路径即可轻松传递动态谓词。例如,primefaces lazy datatable为您提供了一个带有bean属性路径表示法的过滤器映射。如果不需要样板代码,则必须使用反射。
BeanComparator bc = new BeanComparator("name");
Collections.sort(employeeList, bc);