2012-07-11 24 views
14

Hãy xem xét một lớp đơn giản:sánh vs Apache BeanComparator

class Employee { 

String name; 
int sal; 

....//getters and setters 
} 

tôi có thể tạo một sánh để sắp xếp vào tên trường ví dụ.

class EmpSortByName implements Comparator<Employee>{ 

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

Tuy nhiên, nhìn vào commons apache BeanComparator, phân loại có thể đạt được theo cách sau:

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

Do đó, bằng cách sử dụng BeanComparator, tôi có thể đạt được sắp xếp với mã tối thiểu. Sự cân bằng giữa việc sử dụng Comparators và BeanComparators như thế nào: về hiệu suất, kịch bản sử dụng (sắp xếp nhiều trường, các yếu tố khác)?

Tôi cũng hiểu rằng để sử dụng BeanComparator, các hạt đậu jar phải được nhập khẩu.

+0

đó là một tối thiểu "rõ ràng" mã. đừng quên bạn không biết BeanComparator có thể làm gì và có thể kém hiệu quả hơn cách đầu tiên –

Trả lời

19

BeanComparator sử dụng sự phản chiếu để truy cập thuộc tính tên và so sánh hai đối tượng. Mặc dù hiệu suất phản chiếu đã được cải thiện nhưng vẫn không nhanh như truy cập trực tiếp vào một trường. Cho dù điều này là quan trọng hay không phụ thuộc vào bao nhiêu lần nó được gọi là trong ứng dụng của bạn, và trong bối cảnh đó.

Một vấn đề khác là, nếu bạn cấu trúc lại phương thức và đổi tên thành getLastName(), mã sử dụng BeanComparator sẽ không được tái cấu trúc và sự cố sẽ không được chú ý cho đến khi thời gian chạy (hoặc thời gian thử nghiệm đơn vị).

Thẳng thắn, việc triển khai trình so sánh quá dễ đến mức tôi không nghĩ việc sử dụng sự phản chiếu là một ý tưởng hay. Lợi ích của việc tránh 4 dòng mã tầm thường là không đủ để bù đắp cho các vấn đề hiệu năng và bảo trì mà nó gây ra.

+0

HOÀN TOÀN đồng ý +1 – MaVRoSCy

+0

@JB Bạn đúng, do phản ánh sẽ có hiệu suất trúng. Trong trường hợp nào BeanComparator nên sử dụng? Mã 'tối thiểu' là lý do duy nhất? Bạn có thể nghĩ ra bất kỳ lý do nào khác không? –

+3

Tôi chưa bao giờ có nhu cầu sử dụng bản thân, nhưng tôi có thể tưởng tượng sử dụng nó trong các bài kiểm tra đơn vị, hoặc khi một giao diện người dùng cho phép tự động chọn đối tượng thuộc tính nào phải được sắp xếp hoặc trong thẻ JSP như displaytag. đậu mà không biết loại của chúng mà không cần nhà phát triển cung cấp một bộ so sánh –

2

Ngoài ra với beancomparator bạn có thể so sánh hơn là một thuộc tính trong cách dễ dàng với compareTuple org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple); Collections.sort(List,beanComparator);