关闭

改写equals 方法时请遵守的约定

202人阅读 评论(0) 收藏 举报

 

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类型,不要将其修改为其他类型,否则的话,则为重载,而不是重写了
 * 	
 * 
 * /
 */

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    多向别人学习