2012-07-11 27 views
14

Considere una clase simple:Comparador vs Apache BeanComparator

class Employee { 

String name; 
int sal; 

....//getters and setters 
} 

puedo crear un comparador para ordenar el nombre del campo, por ejemplo.

class EmpSortByName implements Comparator<Employee>{ 

@Override 
public int compare(Employee e1, Employee e2){ 
    return e1.getName().compareTo(e2.getName()); 
} 
} 

Sin embargo, mirando apache commons BeanComparator, la clasificación se puede lograr en forma siguiente:

BeanComparator bc = new BeanComparator("name"); 
Collections.sort(employeeList, bc); 

Por lo tanto, mediante el uso de BeanComparator, puedo lograr la clasificación con código mínimo. ¿Cuáles son las compensaciones entre el uso de Comparadores y BeanComparators: en términos de rendimiento, escenarios de uso (clasificación de campos múltiples, otros factores)?

También entiendo que para usar BeanComparator, debe importarse el jarro de beanutils.

+0

se trata de un código mínimo "aparente". no olvide que no sabe lo que hace BeanComparator y podría ser menos eficiente que la primera forma –

Respuesta

19

BeanComparator utiliza la reflexión para acceder a la propiedad del nombre y comparar los dos objetos. Aunque el rendimiento de la reflexión ha mejorado, todavía no es tan rápido como acceder directamente a un campo. Si esto es importante o no, depende de cuántas veces se llame en su aplicación y en qué contexto.

Otro problema es que, si refactoriza el método y lo cambia a getLastName(), el código que utiliza BeanComparator no se refactorizará, y el problema pasará desapercibido hasta el tiempo de ejecución (o el tiempo de prueba de la unidad).

Francamente, implementar un comparador es tan fácil que no creo que usar el reflejo sea una buena idea. El beneficio de evitar 4 líneas de código trivial no es suficiente para compensar los problemas de rendimiento y mantenimiento que causa.

+0

TOTALMENTE de acuerdo +1 – MaVRoSCy

+0

@JB Tiene razón, debido a la reflexión habrá un golpe de rendimiento. ¿En qué circunstancias se debe usar BeanComparator? ¿Es el código 'mínimo' la única razón? ¿Puedes pensar en alguna otra razón? –

+3

Nunca he tenido la necesidad de usarlo, pero me imagino usarlo en pruebas unitarias, o cuando una UI permite elegir dinámicamente en qué propiedades se deben ordenar los objetos, o en una etiqueta JSP como displaytag, que tiene que comparar frijoles sin siquiera saber su tipo sin la necesidad de que el desarrollador proporcione un comparador –

2

También con beancomparator se puede comparar más que un atributo de una manera sencilla con compareTuple org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple); Collections.sort(List,beanComparator);