16

単純なクラスを考えてみましょう。

class Employee {

String name;
int sal;

....//getters and setters
}

たとえば、フィールド名でソートするコンパレータを作成できます。

class EmpSortByName implements Comparator<Employee>{

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

ただし、Apache Commons BeanComparatorを見ると、並べ替えは次の方法で実行できます。

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

したがって、BeanComparatorを使用することで、最小限のコードでソートを実現できます。ComparatorsとBeanComparatorsを使用することのトレードオフは何ですか:パフォーマンス、使用シナリオ(複数のフィールドの並べ替え、その他の要因)の観点から?

BeanComparatorを使用するには、beanutilsjarをインポートする必要があることも理解しています。

4

2 に答える 2

22

BeanComparatorは、リフレクションを使用してnameプロパティにアクセスし、2つのオブジェクトを比較します。リフレクションのパフォーマンスは向上しましたが、フィールドに直接アクセスするほど高速ではありません。これが重要かどうかは、アプリケーションで何回呼び出されたか、およびどのコンテキストで呼び出されたかによって異なります。

もう1つの問題は、メソッドをリファクタリングして名前をに変更するとgetLastName()、BeanComparatorを使用するコードがリファクタリングされず、実行時(または単体テスト時間)まで問題が認識されないことです。

率直に言って、コンパレータの実装は非常に簡単なので、リフレクションを使用するのは良い考えではないと思います。4行の些細なコードを回避することの利点は、それが引き起こすパフォーマンスと保守性の問題を補うのに十分ではありません。

于 2012-07-11T21:24:35.950 に答える
3

また、beancomparatorを使用すると、compareTupleを使用して複数の属性を簡単に比較できます。 org.ujac.util.BeanComparator beanComparator = new org.ujac.util.BeanComparator(compareTuple); Collections.sort(List,beanComparator);

于 2013-01-17T06:20:01.143 に答える