methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

Javaで2項演算.

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