http://d.hatena.ne.jp/methane/20051111/1131720867 の続き
Javaで、継承による対象性・推移性破壊を怖がらず、比較演算を定義する方法。
Comparableをimplementsしたクラスを作ると、継承したクラスを作られたときに対象性・推移性を保つのに苦労する。finalじゃないクラスはComparableをimplementsせずに、public staticな内部クラスとしてComparatorを用意しよう。(C++で2項演算子をfriendな外部関数としてオーバーロードするのと同じ雰囲気)
public class Person {
private String name;
public Person( String name ){
this.name = name;
}
// Personのサブクラスも、Personとして比較する.
public static class NameComparator implements java.util.Comparator {
public int compare( Person lh, Person rh ){
return lh.name.compareTo( rh.name );
}
}
}
implements Comparator<> してるから、汎用アルゴリズムを使いたいときには便利だけど、ただ比較したいだけならインスタンス作るのメンドクサイなぁ。
と、えらそうなことを書きつつ、実はJavaの流儀をまだ判ってない。間違ってる or 本当はもっとスマートな方法があるなら教えて。