package cn.xf.cp.ch02.item8.transitivity;

public class Point
{
private final int x;
private final int y; public Point(int x, int y)
{
this.x = x;
this.y = y;
} @Override
public boolean equals(Object obj)
{
if(!(obj instanceof Point))
{
return false;
}
Point p = (Point) obj;
return this.x == p.x && this.y == p.y;
}
}

首先写一个点类

然后是一个颜色的,枚举

package cn.xf.cp.ch02.item8.transitivity;

public enum Color
{
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}

开始重写其equals方法,来综合比较颜色和点的属性

package cn.xf.cp.ch02.item8.transitivity;

public class ColorPoint extends Point
{
private final Color color;
public ColorPoint(int x, int y, Color color)
{
super(x, y);
this.color = color;
} //这里写个euqals,来比较颜色点,但是这样的话普通点:颜色点 和 颜色点 :普通点返回不一样
public boolean equals1(Object obj)
{
if(!(obj instanceof ColorPoint))
{
return false;
}
//这样进行比较,保证父类和自己
return super.equals(obj) && ((ColorPoint) obj).color == color;
} //但是上面方法不能区别(1,2)的点和(1,2,red)这样比较的时候,如果我们不想比较颜色的时候
//所以改进,保证x.equals(y)和y.equals(x)保持一致
//但是这样,x.equals(y)和y.equals(z),x.equals(z)
public boolean equals2(Object obj)
{
if(!(obj instanceof Point))
{
return false;
} if(!(obj instanceof ColorPoint))
{
//如果是Point对象不是颜色点对象,那就直接比x,y的大小
return obj.equals(this);
}
//比较全部内容
return super.equals(obj) && ((ColorPoint) obj).color == color;
}
}

在实现这样的比较的时候

使用复合优先于继承

我们使用复合的方式来做就会方便很多

package cn.xf.cp.ch02.item8.transitivity;

public class ColorPoint2
{
private final Point point;
private final Color color; public ColorPoint2(int x, int y, Color color)
{
if(color == null)
throw new NullPointerException();
point = new Point(x, y);
this.color = color;
} public Point asPoint()
{
return point;
} @Override
public boolean equals(Object obj)
{
if(!(obj instanceof ColorPoint2))
return false; ColorPoint2 cp2 = (ColorPoint2) obj;
//分别调用本书的equals方法进行比较
return cp2.point.equals(point) && cp2.color.equals(color);
} }

【Effective Java】4、覆盖equals时请遵守通用约定的更多相关文章

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

    第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和fina ...

  2. Item 8 覆盖equals时请遵守通用约定

    在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容:   equals方法实现了等价关系:   自反性.对于任何非null的引用值,x.eq ...

  3. 第八条:覆盖equals时请遵守通用约定

    ==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...

  4. 覆盖equals时请遵守通用约定

    Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只 ...

  5. 第10项:重写equals时请遵守通用约定

      重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...

  6. 覆盖equals方法时请遵守通用约定

    覆盖equals方法时请遵守通用约定   覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...

  7. EffectiveJava(8)覆盖equals是要遵守的约定

    覆盖equals是要遵守的约定 1.覆盖种类: -类的每个1实例本质上都是唯一的 -不关心类是否提供了"逻辑相等"的测试功能(Random测试是否能随机相同数字) -超类已经覆盖了 ...

  8. Effective Java 学习笔记之所有对象都通用的方法

    一.覆盖equals时请遵守通用约定 1.满足下列任何一个条件时,不需要覆盖equals方法 a.类的每个实例本质上都是唯一的.此时就是Object中equals方法所表达的含义. b.不关心类是否提 ...

  9. 重写equals时,遵守的规定

      0 正确的equals方法 public class MyClass { // 主要属性1 private int primaryAttr1; // 主要属性2 private int prima ...

随机推荐

  1. PL/SQL Developer去掉启动时自动弹出的Logon弹出框方法

    以前用PL/SQL Developer 7.0版本,最近升级到PL/SQL Developer 11.0版本,但每次启动PL/SQL Developer都会自动弹出Logon窗口,并且选中其中的登录历 ...

  2. saiku 分布式实践

    saiku比较吃内存,一旦人多了,那么内存可能不够,所以会考虑主从结构,分担压力.为了保证数据的稳定性,也会有类似的考虑,那么问题来了,如何实现saiku的分布式搭建哪? 我阅读了一些国内的文章,没有 ...

  3. 何为.Net Remoting【转】

    借助基维百科给它的定义如下: NET Remoting 是微软 .NET Framework 中的一种网络通讯技术,与 XML Web Service 不同的是,它可以使用 SOAP 以外的协定来通讯 ...

  4. Unity不同平台生成中预处理的注意点

    http://blog.csdn.net/pandawuwyj/article/details/7959335 Unity3D的项目,这周吃亏在宏上了.大背景是项目需要在Unity中用Hudson自动 ...

  5. Netty4 中的内存管理

    在Netty4中引入了新的内存管理机制极大地提升其性能,本文将对该内在管理机制进行剖析. 这里有篇文章讲述了在推特(Twitter)内部 使用Netty的状况以及Netty4所带来的性能收益. 在分析 ...

  6. WindowsServer2012桌面图标设置

    1.win+R调出运行窗口 2.输入:rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 即可

  7. dell 电脑关闭触摸板的。

    桌面计算机(点击右键)----管理----设备管理器-----鼠标------选择触摸板(ps/2 兼容鼠标)---右击------跟新驱动-------浏览计算机查找------从计算机列表中选择- ...

  8. Fire!(BFS)

    Fire! Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Descr ...

  9. [转] VB之Val()函数的使用

    在VB中,也许你或多或少会希望得到的数据转换成数字类型,数字类型既可以是整形,单精度,双精度,浮点数,只要是数字类型这个都可以使用,不过此函数只返回字符串中包含的数字,若第一个字符为字母或者非数字字符 ...

  10. java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放

    一.MP3播放器 查看Android API文档可以看到MediaPlayer状态转换图: 练习: package com.shellway.mp3player; import java.io.Fil ...