`
mazhongjia
  • 浏览: 26286 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

EffectiveJava2_Item7在改写equals方法的时候遵守通用约定

JDK 
阅读更多
import java.awt.Color;

public class Point {

	private final int x;

	private final int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public boolean equals(Object o) {
		if (!(o instanceof Point))
			return false;
		Point p = (Point) o;
		return p.x == x && p.y == y;
	}
	
}

/**
 * 采用继承扩展类后覆盖的equals方法存在缺陷
 * @author Administrator
 */
class ColorPoint extends Point{
	
	private Color color;

	public ColorPoint(int x, int y,Color color) {
		super(x, y);
		this.color = color;
	}
	
	/**
	 * 不具有对称性
	 */
	public boolean equals(Object o){
		if(!(o instanceof ColorPoint))
			return false;
		ColorPoint cp = (ColorPoint) o;
		return super.equals(o) && cp.color == color;
	}
	public static void main(String[] args) {
		ColorPoint p1 = new ColorPoint(1,2,Color.RED);
		Point p2 = new Point(1,2);
		System.out.println(p1.equals(p2));
		System.out.println(p2.equals(p1));
	}
	
//	/**
//	 * 不具有传递性
//	 */
//	public boolean equals(Object o){
//		if(!(o instanceof Point))
//			return false;
//		if(!(o instanceof ColorPoint))
//			return o.equals(this);
//		
//		ColorPoint cp = (ColorPoint) o;
//		return super.equals(o) && cp.color == color;
//	}
//	public static void main(String[] args) {
//		ColorPoint p1 = new ColorPoint(1,2,Color.RED);
//		Point p2 = new Point(1,2);
//		ColorPoint p3 = new ColorPoint(1,2,Color.BLUE);
//		System.out.println(p1.equals(p2));
//		System.out.println(p2.equals(p3));
//		
//		System.out.println(p1.equals(p3));
//	}
}

class ColorPointOK {
	
	private Point point;//组合一个point对象,不采用继承
	
	private Color color;//新增属性
	
	public ColorPointOK(int x,int y,Color color){
		point = new Point(x,y);
		this.color = color;
	}
	
	public Point asPoint(){
		return point;
	}
	
	public boolean equals(Object o){
		if(!(o instanceof ColorPointOK))
			return false;
		ColorPointOK cp = (ColorPointOK) o;
		return cp.point.equals(point) && cp.color.equals(color);
	}
}
//总结:可以在一个抽象类的子类中增加新的特征,而不会违反equals的约定。只要不可能创建超类的实例,那么前面所述的种种问题都不会发生
//      不需要进行if(o == null) return false;的检查,因为o instanceof ColorPointOK检查时如果o == null 则检查结果为false
//      高质量equals方法的步骤:
//		1)使用==操作符检查"实参是否为指向对象的一个引用"。如果是的话,则返回true
//		2)使用instanceof操作符检查"实参是否为正确的类型"。如果不是的话则返回false。这里"正确的类型"是指equals方法所在的那个类。有些情况下,是指该类所实现的某个接口。如果一个类实现的一个接口改进了equals约定,允许在实现了该接口的类之间进行比较,那么使用这个接口作为正确的类型。jdk的集合接口具有这样的特点
//		3)上述instanceof测试成功后把实参转换到正确的类型。
//		4)对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域值是否匹配。如果所有测试都成功,则返回true,否则返回false;(本条更详细的描述请参见effectiveJavaItem7)
//		5)当你编写完了equals方法之后,应该问自己三个问题:他是否是对称的、传递的、一致的(其他两个特性(非空、自反)通常会自行满足)

 

分享到:
评论

相关推荐

    java_equals用法

    java_equals用法,用来熟悉重写equals方法的

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    Java语言深入_equals

    在Java API规范中,`equals`方法必须遵循以下五个基本原则: 1. 对于任何引用类型,`o.equals(o)`总是返回`true`。 2. 如果`o.equals(o1)`返回`true`,则`o1.equals(o)`也应该返回`true`(对称性)。 3. 如果`o....

    Effective Java第三版1

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,该书的第三版继续提供了关于如何编写高效、优雅、可维护的Java代码的指导。以下是基于给出的目录和部分内容提取的一些关键知识点: ### 第一...

    2.javaequals()方法.zip

    2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....

    Java中equals方法隐藏的陷阱

    在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见陷阱,并提供相应的解决方案。 ####...

    重写equals方法

    在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用,但是这并不满足实际需求...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    java中的==和equals()方法1

    在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...

    重载equals方法示例

    重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例

    equals方法的重写.docx

    2. **避免循环引用**:在递归或循环调用`equals`方法时要小心,以避免无限循环。 3. **性能考虑**:对于大型对象或复杂类型的比较,应考虑性能问题,尽可能减少不必要的计算。 综上所述,正确地重写`equals`方法...

    超详细_解释java_equals()与hashCode().pdf

    在Java编程中,`equals()`和`hashCode()`方法是Object类中的两个重要方法,它们在比较和处理对象时起着至关重要的作用。`equals()`方法用于判断两个对象是否相等,而`hashCode()`方法则与对象在哈希表中的存储位置...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    effectiveJava课件分享

    在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...

    java中equals和==的区别

    Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...

    effective_java_new:Effective_java_new

    《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程准则和最佳实践,旨在帮助开发者写出更高效、更健壮的Java代码。"Effective_java_new"可能指的是该书的一个更新版或...

    java中hashcode()和equals()方法详解

    在Java编程语言中,`hashCode()`和`equals()`方法是非常重要的概念,它们不仅对于深入理解Java内存管理至关重要,也是实现自定义类的关键部分之一。本文将详细介绍这两个方法的工作原理、使用场景以及它们之间的关系...

    Java中的==和equals区别

    在Java编程中,比较对象的相等性是一个常见的需求,但很多初学者对于`==`运算符与`equals`方法的区别容易混淆。本文将深入探讨两者之间的差异,以及它们在不同场景下的应用。 #### `==` 运算符 `==`运算符主要用于...

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals...在Java中,正确实现`hashCode`和`equals`方法对于确保`Set`接口的有效性和高性能至关重要。开发人员需要仔细设计这两个方法,以满足`Set`接口的要求,并考虑到性能和一致性等方面。

Global site tag (gtag.js) - Google Analytics