最近在看一本很基础的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年版。
分享到:
- 2009-04-11 20:28
- 浏览 807
- 评论(2)
- 论坛回复 / 浏览 (0 / 1847)
- 查看更多
相关推荐
下面是一些关于重写 `equals()` 和 `hashCode()` 的最佳实践: 1. **一致性**:如果 `a.equals(b)` 为 true,那么 `a.hashCode()` 应该等于 `b.hashCode()`。 2. **非空性**:`hashCode()` 不应返回 null,而应返回...
在Java编程语言中,"equals"方法是Object类的一个核心方法,用于比较两个对象是否相等。当我们需要自定义对象的相等性判断标准时,就需要重写(override)这个方法。标题"1_equals_overridingequals_"暗示了我们讨论...
在Java编程中,`equals()` 和 `hashCode()` 方法是Object类中的两个重要方法,它们在处理对象相等性以及在哈希表(如HashSet、HashMap)中起到关键作用。...遵循上述原则和最佳实践,可以确保代码的正确性和效率。
在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。...通过这种方式,我们可以确保数据结构的高效运行并遵循Java编程的最佳实践。
在Java编程语言中,`equals()`方法是一个非常关键的概念,特别是在处理对象比较的时候。...而压缩包"DAL.rar"可能包含了关于如何在数据访问层中有效使用`equals()`方法的实例、示例代码或者最佳实践。
在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。...通过遵循上述原则和最佳实践,我们可以确保对象的比较行为符合预期,并优化程序性能。
另外,为了避免空指针异常,使用"equals()"之前最好先检查对象是否为null,或者使用"Objects.equals()"方法。 总结来说,"=="比较的是对象引用,而"equals()"比较的是对象的内容。在处理字符串时,理解这两者的差异...
在实现`equals()`和`hashCode()`时,应遵循以下最佳实践: - 如果重写了`equals()`,务必同时重写`hashCode()`。 - 使用对象的属性来计算哈希码,而不是对象的引用。 - 在`equals()`方法中,使用`==`来比较基本类型...
在实现`equals()`和`hashCode()`时,遵循以下最佳实践: 1. 如果重写了`equals()`,务必也重写`hashCode()`,以保持两者的一致性。 2. `equals()`方法应该对称、传递、一致和非否定性。即a.equals(b)等于b.equals(a)...
Java面向对象设计最佳实践主要关注方法的设计,这是创建高效、可维护和易于理解的代码的关键。方法作为类或对象的行为,它们定义了类的功能并利用多态性来增强设计的灵活性。以下是一些关于方法设计的重要实践: 1....
本文将深入探讨如何利用Android广播最佳实践来实现强制下线功能,帮助开发者更好地理解和应用这一关键机制。 一、Android广播基础知识 1. 系统广播:由Android系统触发,如设备开机、网络状态变化等。 2. 自定义...
为了提高代码的效率和可读性,建议遵循以下最佳实践: - 当比较基本类型时,使用 `==` 操作符。 - 对于引用类型,特别是 String,优先考虑使用 `equals()` 方法来比较内容,除非你确实需要检查两个引用是否指向同一...
本教程将重点讲解`equals()`方法的使用,特别是在面向对象编程中的实践。通过本教程的练习,您将学习如何自定义`equals()`方法来满足特定类的比较需求。 首先,让我们理解默认的`equals()`行为。当我们在两个对象上...
4. 最佳实践是尽可能减少不必要的对象创建,尤其是在使用 `String` 时,可以尽早将 `String` 实例化为常量池中的对象。例如,`String s2 = "Monday".intern();` 这样做可以确保即使使用 `new` 关键字,也能够重用池...
在前端开发中,我们经常需要处理文件和目录的操作,例如读取、写入、比较等。"fs-equals"是一个专门为前端开发者设计的开源库...通过阅读源代码,你可以学习到更多关于文件系统操作、错误处理以及异步编程的最佳实践。
本文将深入探讨`equals`方法的基本概念、实现细节以及最佳实践,帮助读者更好地理解和掌握这一重要的Java知识点。 #### 二、`equals`方法的基本概念 1. **默认行为**:`equals`方法最初定义于`Object`类中,其默认...
这个压缩包包含了作者在书中提到的一些示例代码,通过分析和实践这些代码,我们可以深入理解这些最佳实践,并将其应用到实际的Java项目中。以下是关于这些经验法则的详细解释: 1. **使用接口而非具体类(Item 2)*...
在Java编程语言中,了解`==`和`equals()`的区别是非常重要的,这涉及到对基本类型和对象的正确比较。...为了确保代码的可读性和一致性,对于自定义的类,最好也重写`equals()`方法,以符合业务逻辑的需求。
- **最佳实践**:在重写`equals`方法时,应使用`public boolean equals(Object obj)`这样的签名。 ##### 9. "equals(Object obj)" should test argument type - **解释**:在实现`equals`方法时,应当首先检查传入...