Компаратор против 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);