/**
* 論理的等価性(logical equality)が必要で、且つスーパークラスがそれに対応する
* equals()メソッドを実装していない場合に、equals()メソッドを実装する。
* また、equals()メソッドを実装する際には、一般契約(Generic Contract)を守らなければ
* ならない。この契約違反をした場合、JVM実装はどのような振る舞いをするか分からない。
* 一般契約一覧
*
* - 反射性(Reflexivity)
* - 対称性(Symmetry)
* - 推移性(Transitivity)
* - 整合性(Consistency)
* - 非null性(Non-nullity)
*
*
* - equalsをオーバーライドする時は、常にhashCodeをオーバーライドしなければならない
*
* @see 実装参考 Effective Java 第3章項目7 equalsをオーバーライドする時は一般契約に従う
*
* @author s-okita
*/
package com.util;
public class GenericContract {
private int status;
public GenericContract() {
status = 0;
}
/**
* reflexive contract
* Symmetric contract
*/
public boolean equals(Object obj) {
// 下記、Exceptionを生成しないように実装する事が、equals一般契約である。
// NullPointerException.
// ClassCastException
// 最初に行うのはnullチェックではなく、instanceof
// これにより、NullPointerException, ClassCastExceptionを回避する。
//if (obj != null) {
if (obj instanceof GenericContract) {
if (this == obj) { // reflexive
return true;
} else {
// Symmetric
if (this.status == ((GenericContract)obj).getStatus()) {
return true;
}
}
}
return false;
}
/**
* @return
*/
public int getStatus() {
return status;
}
/**
* @param i
*/
public void setStatus(int i) {
status = i;
}
}