2007 年 1 月 28 日 0 時 0 分

今更 toString & equals & hashCode


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


メッセージの流れを調べるためには、
受信したメッセージをデバッグ出力すればよいのだが、
今まで toString をオーバーライドしていなかった。

ずっと忘れてたよ。

一般的に、クラスは toString をオーバーライドし、
インスタンスの文字列表現を提供するのが好ましい。
これはデバッグの大きな補助となるのだ。

また、equals/hashCode も大事なメソッドだ。

ColorEntry 等、インスタンスの値が重要なクラスは、
そのインスタンス同士を比較する際に、
equals をオーバーライドして独自の比較処理を実装する。

また、equals をオーバーライドして実装するクラスは、
必ず hashCode もオーバーライドする必要がある。

hashCode は主に、クラスのインスタンスが
Map を実装するクラスでキーとして利用する際に使われる。
hashCode が異なる値を返すのならば、
絶対に equals は false を返すという仕組みを利用し、
キーの比較や格納を最適化することができるからだ。

ということで、メッセージ用に利用されるクラスを中心に、
これらの実装を追加していこう。

========== PixelFormat#toString ==========

    /**
     * @see Object#toString()
     */
    @Override
    public String toString() {
        return getClass().getName()
                + "[bitPerPixel=" + bitPerPixel + ",depth=" + depth
                + ",bigEndian=" + bigEndian + ",trueColor=" + trueColor
                + ",redMax=" + redMax + ",greenMax=" + greenMax
                + ",blueMax=" + blueMax + ",redShift=" + redShift
                + ",greenShift=" + greenShift + ",blueShift=" + blueShift + "]";
    }

========== end of PixelFormat#toString ==========

========== ColorEntry.java ==========

    // (…前略…)

    /**
     * @see Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof ColorEntry))
                return super.equals(obj);
       
        ColorEntry color = (ColorEntry)obj;
        return color.red == red
                && color.green == green
                && color.blue == blue;
       
    }

    /**
     * @see Object#hashCode()
     */
    @Override
    public int hashCode() {
        return red << 16 | green << 8 | blue;
    }

    /**
     * @see Object#toString()
     */
    @Override
    public String toString() {
        return getClass().getName()
                + "[RGB=" + red + "," + green + "," + blue + "]";
    }

    // (…後略…)

========== end of ColorEntry#toString ==========

PixelFormat は、toString の実装だけにしておこう。
というのも、equals や hashCode が面倒だから。

ColorEntry は、red, green, blue の 3 色の値を持つのだが、
その 3 フィールドの値が完全に一致するインスタンスは、
同等とみなすように equals を実装しておけば、
ColorEntry インスタンスを比較する際に便利となる。

また、hashCode を適切に実装しておけば、
Map のキーとして ColorEntry を使うことができる。
今の所使う予定はないが、もしカラーテーブルを実装し、
フルカラーからの減色処理等を行うことがあれば、
便利に使うことができる可能性がある。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.