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 本当はもっとスマートな方法があるなら教えて。