Komparator vs Apache BeanComparator
Betrachten Sie eine einfache Klasse:
class Employee {
String name;
int sal;
....//getters and setters
}
Ich kann ein Comparator zum Sortieren auf Feld-Namen zum Beispiel.
class EmpSortByName implements Comparator<Employee>{
@Override
public int compare(Employee e1, Employee e2){
return e1.getName().compareTo(e2.getName());
}
}
Dennoch, mit Blick auf apache commons BeanComparator, die Sortierung kann erreicht werden, in folgender Weise:
BeanComparator bc = new BeanComparator("name");
Collections.sort(employeeList, bc);
So, durch die Verwendung BeanComparator kann ich erreichen Sortierung mit minimalem code. Was sind die trade-offs zwischen der Verwendung von Komparatoren und BeanComparators: in Bezug auf Leistung, Einsatz Szenarien (mehrere Felder Sortieren, andere Faktoren)?
Ich auch verstehen, dass die Verwendung von BeanComparator, die beanutils jar importiert werden.
- es ist ein minimales "scheinbare" code. vergessen Sie nicht, Sie wissen nicht, was BeanComparator tut und vielleicht weniger performant als die erste Möglichkeit
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den BeanComparator verwendet reflektion, um die name-Eigenschaft und vergleichen Sie die beiden Objekte. Obwohl die Reflexion hat die Leistung verbessert, ist es noch nicht so schnell wie der Zugriff auf ein Feld direkt. Ob dies wichtig ist oder nicht, hängt davon ab, wie oft es heisst in Ihrer Anwendung und in welchem Kontext.
Ein weiteres problem ist, dass, wenn Sie umgestalten der Methode und benennen Sie es um
getLastName()
, den code mit BeanComparator wird nicht umgestaltet werden, und das problem wird unbemerkt bleiben, bis die Laufzeit (oder unit-Test-Zeit).Ehrlich gesagt, die Umsetzung eines Komparators ist so einfach, dass ich glaube nicht, dass mit der spiegelung ist eine gute Idee. Der Vorteil der Vermeidung von 4 Linien der triviale code ist nicht ausreichend, um einen Ausgleich für die performance und die Wartbarkeit der Probleme, die es verursacht.
Auch mit beancomparator vergleichen Sie mehr als ein Attribut auf einfache Weise mit compareTuple
org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple);
Collections.sort(List,beanComparator);