Компаратор против Apache BeanComparator
Рассмотрим простой класс:
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());
}
}
Однако, глядя на apan commons BeanComparator, сортировка может быть достигнута следующим образом:
BeanComparator bc = new BeanComparator("name");
Collections.sort(employeeList, bc);
Таким образом, используя BeanComparator, я могу добиться сортировки с минимальным кодом. Каковы компромиссы между использованием Comparators и BeanComparators: с точки зрения производительности, сценариев использования (сортировка нескольких полей, другие факторы)?
Я также понимаю, что для использования BeanComparator необходимо импортировать банку beanutils.
Ответы
Ответ 1
BeanComparator использует отражение для доступа к свойству name и сравнения двух объектов. Хотя эффективность отражения улучшилась, она все еще не так быстро, как прямой доступ к полю. Независимо от того, важно это или нет, зависит от того, сколько раз он вызывал в вашем приложении и в каком контексте.
Другая проблема заключается в том, что если вы реорганизовываете метод и переименовываете его в getLastName()
, код с использованием BeanComparator не будет реорганизован, и проблема останется незамеченной до времени выполнения (или времени тестирования).
Честно говоря, реализация компаратора настолько проста, что я не думаю, что использование рефлексии - хорошая идея. Преимущество избежания четырех строк тривиального кода недостаточно для компенсации проблем, связанных с производительностью и ремонтопригодностью.
Ответ 2
Также с beancomparator вы можете сравнить более один атрибут простым способом с помощью compareTuple
org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple);
Collections.sort(List,beanComparator);