package EffectiveJava;
import static java.lang.System.out;
// 一个违反对称性的类
class CaseString{
private String s;
public CaseString(String s) {
this.s = s;
}
@Override //这个方法的目的是为了使CaseString 和 String 可以互操作,但这是做不到的,只会违反的equals的对称性
public boolean equals(Object o) { //该方法违反了对称性,即CaseString.equals(String) 而 String not equals (CaseString) ,String 只能equals String
if(o instanceof String)
return s.compareToIgnoreCase((String)o)==0;
if(o instanceof CaseString)
return s.compareToIgnoreCase(((CaseString)o).s)==0;
return false;
}
}
public class _3_7_equals {
public static void main(String args[]) {
CaseString s1 = new CaseString("abc");
String s2 = "abc";
out.println(s1.equals(s2));
out.println(s2.equals(s1));
}
}
/**
* 还有一个Point类的经典例子
* Point类(int x,int y)
* |———— ColorPoint(int x,int y,Color)
*
*
*/
/**
* 编写 equals 的步骤
* 1. 用 == 对其进行是否同一对象引用的判断,有利于效率的提高
* 2. instanceof 类型判断,相同,true 否则 false ,如果是对于同一接口类型的判断,如果Collection 集合的判断,只要继承了List接口,就可以接下来的判断了
* 3. 实参转换成正确的类型
* 4. 对类型中的关键域进行匹配,如非 Double Float的基本类型,直接== 判断,如果是Double Float 要将其转换成 long 或 int 再用 == 进行判断
* 对于数组类型的判断,要遍历其中的每一个类型进行判断,可以使用AbstractList 类中的方法
* return (o1==o2) || (o1!=null && o1.equals(o2))
* 5.对于修改equals 方法时,总要修改 hashCode 方法
* 6.equals方法的参数为Object类型,不要将其修改为其他类型,否则的话,则为重载,而不是重写了
*
*
* /
*/