このアーカイブは同期化されません。 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 を使うことができる。
今の所使う予定はないが、もしカラーテーブルを実装し、
フルカラーからの減色処理等を行うことがあれば、
便利に使うことができる可能性がある。