[java] 更好的书写equals方法-汇率换算器的实现(4)

 

[java] 更好的书写equals方法-汇率换算器的实现(4)

2 完美的一个equals方法应该包含的内容

  1. 首先判断两个对象是不是同一个对象

    if (this == otherObject) return true;
    
  2. 当另一个对象为空时, 返回false
    if (otherObject == null) return false;
    
  3. 比较的两个类的类型应该相同
    if (getClass() != otherObject.getClass()) return false;
    

    但是有一些人可能会使用下面的方式:

    if (!(otherObject instanceof ThisClass)) return false;
    

    这样会导致一个问题, 如:

    // 父类
    class People {
    public People(String name) {
    this.name = name;
    } public boolean equals(Object obj) {
    if (this == obj) return true; if (obj == null) return false; // if (getClass() != obj.getClass()) return false;
    if (!(obj instanceof People)) return false; People other = (People) obj;
    return name.equals(other.name);
    } private String name;
    } // 子类
    class Student extends People {
    public Student(String name, String studentID) {
    super(name);
    this.studentID = studentID;
    } public boolean equals(Object obj) {
    if (!super.equals(obj)) return false; Student s = (Student) obj; return studentID == s.studentID;
    } private String studentID;
    }

    当在main函数中运行下面的例子时, 就会抛出ClassCastException的异常

    public class Demo {
    public static void main(String[] args) {
    People p1 = new People("zhang");
    Student s1 = new Student("zhang", "ID1"); System.out.println(s1.equals(p1));
    }
    }

    因此在具体实现过程中建议使用:

    if (getClass() != otherObject.getClass()) return false;
    
  4. 最后进行类型转换, 比较各个字段的大小
    People other = (People) obj;
    return name.equals(other.name);

3 将汇率转换器中的部份代码进行修改

将Money类中的equals方法进行修改:

/**
当货币单位以及货币量都相等时, 两个货币对象就相等
@param obj 货币
@return 相等为<code>true</code>, 不相等为<code>false</code>
*/
public boolean equals(Object obj) {
if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Money other = (Money) obj;
return amount == other.amount
&& unit.equals(other.unit);
}

Date: 2014-05-17 Sat

Author: Zhong Xiewei

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0

[java] 更好的书写equals方法-汇率换算器的实现(4)的更多相关文章

  1. 关于java中的hashcode和equals方法原理

    关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...

  2. [java] 汇率换算器实现-插曲1-正则表达式(1)

    [java] 汇率换算器实现-插曲1-正则表达式(1) // */ // ]]> // */ // ]]>   [java] 汇率换算器实现-插曲1-正则表达式(1) Table of C ...

  3. [java] 汇率换算器实现(2)

    [java] 汇率换算器实现(2) // */ // ]]> // */ // ]]>   [java] 汇率换算器实现(2) Table of Contents 1 系列文章地址 2 前 ...

  4. [java] 汇率换算器实现(3)

    [java] 汇率换算器实现(3) // */ // ]]>   [java] 汇率换算器实现(3) Table of Contents 1 系列文章地址 2 前言 3 提取简单表单信息 3.1 ...

  5. [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3

    [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 // */ // ]]>   [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 Table of C ...

  6. [java] jsoup使用简介-汇率换算器实现-插曲2

    [java] jsoup使用简介-汇率换算器实现-插曲2 // */ // ]]>   [java] jsoup使用简介-汇率换算器实现-插曲2 Table of Contents 1 系列文章 ...

  7. [java] 汇率换算器实现(1)

    [java] 汇率换算器实现(1) // */ // ]]>   [java] 汇率换算器实现(1) Table of Contents 1 问题描述 2 类设计 3 初步实现 3.1 建立项目 ...

  8. Java 重写hashCode 方法和equals方法

    package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...

  9. Java:Object类的equals()方法 如何编写一个完美的equals()方法

    一  代码实例: package freewill.objectequals;  /** * @author freewill * @see Core Java page161 * @desc get ...

随机推荐

  1. android 之HttpURLConnection的post,get方式请求数据

    get方式和post方式的区别: 1.请求的URL地址不同: post:"http://xx:8081//servlet/LoginServlet" get:http://xxx: ...

  2. 不能链接云服务器mysql

    如果报host'' 不允许连接MySQL服务器  1130 错误的话如果你的3306端口打开了,也把user 里的host改为% 还是不行的话,请记得更改 站点域名设置,和你服务器相同,端口一致.

  3. 用DataGridView导入TXT文件,并导出为XLS文件

    使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据.也可以导出.txt,.xls等格式的文件.今天我们就先介绍一下用DataGridView把导入txt文件,导出x ...

  4. Android安全开发之通用签名风险

    Android安全开发之通用签名风险 作者:伊樵.舟海.呆狐@阿里聚安全 1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险.And ...

  5. FLEX布局的一些问题和解决方法

    前言 露珠最近研究了一下flex的布局方式,发现项w3c推出的这套布局解决方案对于日益复杂的前端开发布局来说是确实是一利器,并且在不同的屏幕上实现了真正的响应式布局:不再单纯地依赖百分比和float的 ...

  6. Lesson 12 Goodby and good luck

    Text Our neighbour, Captain Charles Alison, will sail from Portsmouth tomorrow. We'll meet him at th ...

  7. Node.js Base64 Encoding和Decoding

    如何在Node.js中encode一个字符串呢?是否也像在PHP中使用base64_encode()一样简单? 在Node.js中有许多encoding字符串的方法,而不用像在JavaScript中那 ...

  8. Java 浅析内部类

    这篇文章主要讲述Java 内部类的相关知识,主要讲解下面的知识点. 内部类的概念 内部类的特点与使用 多种形式内部类 为什么要使用内部类 内部类的概念 内部类是指在一个类的内部定义了另一个类.例如下面 ...

  9. is_null, empty, isset, unset对比

    is_null, empty, isset, unset 我们先来看看这4个函数的描述 isset 判断变量是否已存在(配置)unset 把变量删除(释放)掉empty 判断变量是否为空is_null ...

  10. 弥补学生时代的遗憾~C#注册表情缘

    记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能.直到我研究注册表前一天我都感觉他是那么的高深. 今天正好有空,于是就研究了下注册表系列的操作,也随手封 ...