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

原创 2012年03月30日 19:02:54

 

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

相关文章推荐

第7条】在改写equals的时候请遵守通用约定

《第3章 对所有对象都通用的方法》    这是我认为最有用的一章,真的该好好问问自己,这些最最基础的东西,自己都掌握吗?    Object是个即普通又特殊的类。说它普通是因为所有的类都是由它派生来的...

Java性能优化(7):改写equals时遵守通用约定

尽管Object是一个具体类,但是设计它主要是为了扩展。它的所有非final方法都有明确的通用约定。因为它们都是为了遵守这些通用约定;如果不能做到这一点,则其他一些依赖于这些约定的类就无法与这些类结合...

java对象通用方法之覆盖equals时请遵守通用约定、覆盖equals时总要覆盖hashCode、始终要覆盖toString、考虑实现Comparable接口

原文地址: http://www.cnblogs.com/stephen-liu74/archive/2012/01/16/2228360.html 内容摘要: 覆盖equals时请遵守...

《Effective Java》读书笔记——覆盖equals时请遵守通用约定

equals()方法是Object类的方法,而Object是所有类的顶级父类,所有的类都会拥有Object的方法,也会拥有equals()方法。在Object类中,equals()方法的实现特别简单,...

第8条:覆盖equals时请遵守通用约定

需要满足的条件:  类的每个实例本质上都是唯一的。  不关心类是否提供了“逻辑相等(logical equality)”的测试功能。  超类已经覆盖了equals,从超类继承过来的行为对于子类也...

第八条 覆盖equals请遵守通用的约定(二)

传递性,相同类型的传递性出错基本不可能,出错的一般都是写子类扩展属性的情况。 例如两个类 public class Point {     private int x;     priva...

Effective Java 第八条:覆盖equals请遵守通用约定

首先介绍一下Java中equals通用约定,分别是:自反性、对称性、一致性、传递性。 检查自反性的通用方法: 将对象扔到List里,然后看List.contains()是否返回true。 首先...

第八条 覆盖equals请遵守通用的约定(一)

第八条 覆盖equals请遵守通用的约定(一) 对象的equsls()方法经常会用到,没用过的都不好意思说自己是做java的。那么,这个方法怎么用,或者有什么用处,下面慢慢讲解。 类被实例化出...

【Effective Java】Ch3_Methods:Item8_重写equals方法时遵循通用约定

虽然Object类是一个具体类,但它主要还是用于扩展。因为其所有nonfinal方法(equals、hashCode、toString、clone以及finalize)都是为重写设计的,所以这些方法都...

Effective Java 第8条:覆盖equals时要遵守通用约定

转载 : http://architecture3.riaos.com/?p=3092399 覆盖equals方法貌似很简单,但是有许多覆盖方式会导致错误,所以们应该做到要么不覆盖equals方法,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改写equals 方法时请遵守的约定
举报原因:
原因补充:

(最多只允许输入30个字)