1. 程式人生 > >5.2.1-一個完美的equals方法的誕生.

5.2.1-一個完美的equals方法的誕生.

1. Employee.java

import java.util.Date;
import java.util.Objects;

public class Employee {
    private String name;
    private double salary;
    private Date hireDay;
    //1.為了避免定義一個完全無關的辦法.使用@Override對覆蓋超類的方法標記.
    //2.將顯式引數命名為otherObject,之後會將其轉換為other.
    @Override
    public boolean equals(Object otherObject){
        //3.檢測是否引用同一個物件,這一步的好處是儘量避免對比每一個域.
        if(this==otherObject) return true;
        //4.檢測物件是否為空
        if(null==otherObject) return false;
        //5.比較this和otherObject是否屬於同一個類.
        /*
         * 5.1 如果equals的語義在子類中有所改變,就使用getClass()方法檢測.
         * 5.2 否則,使用instanceof關鍵字檢測:
         * if(!(getClass() instanceof otherObject.getClass()))
         */
        if(getClass()!=otherObject.getClass()) return false;
        //6.將otherObject強轉為相應型別的變數.
        /*
         * 使用Objects.equals(a,b),兩者都是null返回true,僅一個返回false,否則呼叫a.equals(b)
         * 主要是為了防備域都是null的情況
         */
        Employee other = (Employee) otherObject;
        //7.如果子類重新定義了equals方法,需要包含呼叫super.equals(other).
        return super.equals(other)
                &&Objects.equals(name, other.name)
                && salary==other.salary
                && Objects.equals(hireDay, other.hireDay);
    }
}

2.簡寫版equals方法.SimplifiedVersionEquals()


這個方法行不通的!!!哈哈哈哈,被騙了吧,主要是需要形參為Employee型別才能使用other.name,但是一旦需要在程式碼中進行強轉那就不是簡寫版了.