`
seashell752
  • 浏览: 2992 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

equals方法最佳实践

阅读更多
最近在看一本很基础的java书,对equals方法有了进一步的认识。
对于覆盖equals时要覆盖hashCode这里就不写了,这里只讨论equals
package employee;

public class Employee {
	
	private String name;

	public Employee(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public boolean equals(Object obj) {

		if(null == obj) return false;
	         if(!(obj instanceof Employee)) return false;
		Employee other = (Employee)obj;
		return name.equals(other.name);
	}

}

根据<<effective java中文版>>第二版的建议,这样写还算完美。
后来又有了一个类来增加了一些扩展:
package employee;

public class HorlyEmployee extends Employee {

	private int hours;
	
	public HorlyEmployee(String name,int hours) {
		super(name);
		this.hours = hours;
		
	}

	public int getHours() {
		return hours;
	}

	public void setHours(int hours) {
		this.hours = hours;
	}

}


来做一下测试:
public class Test {

	public static void main(String[] args) {
		
		Employee e = new Employee("jack");
		HorlyEmployee he = new HorlyEmployee("jack",5);
		
		System.out.println(e.equals(he));
		System.out.println(he.equals(e));
		
	}

}

结果为:
true
true

但是HorlyEmployee 类也想要自己比较准确的equals方法。hours属性也要进行比较,所以HorlyEmployee 也覆写equals方法,现在HorlyEmployee 类为:
package employee;

public class HorlyEmployee extends Employee {

	private int hours;
	
	public HorlyEmployee(String name,int hours) {
		super(name);
		this.hours = hours;
		
	}

	public int getHours() {
		return hours;
	}

	public void setHours(int hours) {
		this.hours = hours;
	}

	
	@Override
	public boolean equals(Object obj) {

		if(null == obj) return false;
		if(!(obj instanceof HorlyEmployee)) return false;
		HorlyEmployee other = (HorlyEmployee)obj;
		return super.equals(other)&&this.hours == other.hours;
	}
}

现在在来测试:
package employee;

public class Test {


	public static void main(String[] args) {
		
                  HorlyEmployee he = new HorlyEmployee("jack",5);
		HorlyEmployee he2 = new HorlyEmployee("jack",5);
		Employee e2 = new Employee("jack");
		System.out.println(he.equals(he2));
		System.out.println(he2.equals(he));
		
		}

}


结果为:
true
true

但是这样测试呢:
package employee;

public class Test {

	
	public static void main(String[] args) {
		
		Employee e = new Employee("jack");
		HorlyEmployee he = new HorlyEmployee("jack",5);
		System.out.println(e.equals(he));
		System.out.println(he.equals(e));
		
	}

}


结果为:
true
false

明显违返了equals方法的对称性原则。
就因为这个原因是,所以我看的这本书的作者推荐的覆写equals为:
将Employee中的这一行
if(!(obj instanceof Employee)) return false;

和HorlyEmployee 中的这一行
if(!(obj instanceof HorlyEmployee)) return false;

都换成:
if(this.getClass() != obj.getClass()) return false;

这样就不会出现这个问题。

就是这个原因,这本书的作者不推荐用instanceof 而是用 getClass()
原因如下:
有A,B两个类 B extends A 那么有:
a instanceof A 为true  (小写的为对应对象的实例)
b instanceof A 为true 而 a instanceof B 为 false
a1.getClass() == a2.getClass() 为true
a.getClass() == b.getClass() 为false

不知道大家有什么看法?
我看的这本书为<<Absolute Java>>2005年版。





分享到:
评论
2 楼 ycyu09 2009-04-12  
<pre name="code" class="java"><pre name="code" class="java">package filter;

public class HelloWord {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("HelloWord");
}

}
</pre>
&nbsp;</pre>
<p>终于会了,谢谢宝地一试</p>
1 楼 ycyu09 2009-04-12  
package filter;

public class HelloWord {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("HelloWord");
}

}
学习回帖贴代码

相关推荐

    java中hashCode方法与equals方法的用法总结

    下面是一些关于重写 `equals()` 和 `hashCode()` 的最佳实践: 1. **一致性**:如果 `a.equals(b)` 为 true,那么 `a.hashCode()` 应该等于 `b.hashCode()`。 2. **非空性**:`hashCode()` 不应返回 null,而应返回...

    1_equals_overridingequals_

    在Java编程语言中,"equals"方法是Object类的一个核心方法,用于比较两个对象是否相等。当我们需要自定义对象的相等性判断标准时,就需要重写(override)这个方法。标题"1_equals_overridingequals_"暗示了我们讨论...

    重写hashCode()和equals()方法详细介绍

    在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。...遵循上述原则和最佳实践,可以确保代码的正确性和效率。

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。...通过这种方式,我们可以确保数据结构的高效运行并遵循Java编程的最佳实践。

    DAL.rar_equals

    在Java编程语言中,`equals()`方法是一个非常关键的概念,特别是在处理对象比较的时候。...而压缩包"DAL.rar"可能包含了关于如何在数据访问层中有效使用`equals()`方法的实例、示例代码或者最佳实践。

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。...通过遵循上述原则和最佳实践,我们可以确保对象的比较行为符合预期,并优化程序性能。

    字符串比较之 “==”和 “equals”

    另外,为了避免空指针异常,使用"equals()"之前最好先检查对象是否为null,或者使用"Objects.equals()"方法。 总结来说,"=="比较的是对象引用,而"equals()"比较的是对象的内容。在处理字符串时,理解这两者的差异...

    Java中的equals()和hashCode()契约Ja

    在实现`equals()`和`hashCode()`时,应遵循以下最佳实践: - 如果重写了`equals()`,务必同时重写`hashCode()`。 - 使用对象的属性来计算哈希码,而不是对象的引用。 - 在`equals()`方法中,使用`==`来比较基本类型...

    java中hashcode()和equals()的详解

    在实现`equals()`和`hashCode()`时,遵循以下最佳实践: 1. 如果重写了`equals()`,务必也重写`hashCode()`,以保持两者的一致性。 2. `equals()`方法应该对称、传递、一致和非否定性。即a.equals(b)等于b.equals(a)...

    Java面向对象设计最佳实践 - 方法设计(一).docx

    Java面向对象设计最佳实践主要关注方法的设计,这是创建高效、可维护和易于理解的代码的关键。方法作为类或对象的行为,它们定义了类的功能并利用多态性来增强设计的灵活性。以下是一些关于方法设计的重要实践: 1....

    andorid 广播的最佳实践-实现强制下线功能

    本文将深入探讨如何利用Android广播最佳实践来实现强制下线功能,帮助开发者更好地理解和应用这一关键机制。 一、Android广播基础知识 1. 系统广播:由Android系统触发,如设备开机、网络状态变化等。 2. 自定义...

    java中equals和==的区别的剖析.pdf

    为了提高代码的效率和可读性,建议遵循以下最佳实践: - 当比较基本类型时,使用 `==` 操作符。 - 对于引用类型,特别是 String,优先考虑使用 `equals()` 方法来比较内容,除非你确实需要检查两个引用是否指向同一...

    299.297.JAVA基础教程_面向对象(中)-equals()练习1:代码实现(299).rar

    本教程将重点讲解`equals()`方法的使用,特别是在面向对象编程中的实践。通过本教程的练习,您将学习如何自定义`equals()`方法来满足特定类的比较需求。 首先,让我们理解默认的`equals()`行为。当我们在两个对象上...

    java中equals和==的区别文.pdf

    4. 最佳实践是尽可能减少不必要的对象创建,尤其是在使用 `String` 时,可以尽早将 `String` 实例化为常量池中的对象。例如,`String s2 = "Monday".intern();` 这样做可以确保即使使用 `new` 关键字,也能够重用池...

    前端开源库-fs-equals

    在前端开发中,我们经常需要处理文件和目录的操作,例如读取、写入、比较等。"fs-equals"是一个专门为前端开发者设计的开源库...通过阅读源代码,你可以学习到更多关于文件系统操作、错误处理以及异步编程的最佳实践。

    java精典编程100例 22

    本文将深入探讨`equals`方法的基本概念、实现细节以及最佳实践,帮助读者更好地理解和掌握这一重要的Java知识点。 #### 二、`equals`方法的基本概念 1. **默认行为**:`equals`方法最初定义于`Object`类中,其默认...

    实践《Effective Java》书中的经验法则示例代码,结合Java源码来理解这些最佳实践,并应用于实际项目。.zip

    这个压缩包包含了作者在书中提到的一些示例代码,通过分析和实践这些代码,我们可以深入理解这些最佳实践,并将其应用到实际的Java项目中。以下是关于这些经验法则的详细解释: 1. **使用接口而非具体类(Item 2)*...

    Java中==与equals的区别小结

    在Java编程语言中,了解`==`和`equals()`的区别是非常重要的,这涉及到对基本类型和对象的正确比较。...为了确保代码的可读性和一致性,对于自定义的类,最好也重写`equals()`方法,以符合业务逻辑的需求。

    sonar检查规则指南

    - **最佳实践**:在重写`equals`方法时,应使用`public boolean equals(Object obj)`这样的签名。 ##### 9. "equals(Object obj)" should test argument type - **解释**:在实现`equals`方法时,应当首先检查传入...

Global site tag (gtag.js) - Google Analytics