簡體   English   中英

如何重寫equals和tostring方法

[英]How to override equals to and tostring methods

我試圖弄清楚它是如何工作的。 我認為這些方法存儲在java.lang.Object中,但我無法弄清楚如何在代碼中覆蓋它們。 這是我設計的一個小程序來測試我的理解(這是不對的)。

AddressTester:

import java.util.ArrayList;
import java.util.Scanner;

public class AddressTester
{

    public static void main(String[] args)
    {

        Address home = new Address("123 Loving Fat Girl ln", "Dollywood", "NY",
                "98765");

        Scanner in = new Scanner(System.in);

        System.out.println("-- Enter your home address --");
        System.out.println("123 Loving Fat Girl ln, Dollywood, NY, 98765");

        System.out.print("Enter the street address: ");
        String addr = in.nextLine();

        System.out.print("Enter the city: ");
        String city = in.next();

        System.out.print("Enter the state: ");
        String state = in.next();

        System.out.print("Enter the zipcode: ");
        String zipcode = in.next();

        Address enteredAddress = new Address(addr, city, state, zipcode);

        System.out.println(enteredAddress);

        if (home.equals(enteredAddress))
        {
            System.out.println("You are correct!");
        }
        else
        {
            System.out.println("You are incorrect!");
        }

        ArrayList<Address> addresses = new ArrayList<Address>();
        addresses.add(home);

        if (addresses.contains(enteredAddress))
        {
            System.out.println("The address wasn't found");
        }
        else
        {
            System.out.println("The address was found");
        }

    }

}

地址:

public class Address
{
    private String address;
    private String city;
    private String state;
    private String zipcode;


    public Address(String address, String city, String state, String zipcode)
    {
        this.address = address;
        this.city = city;
        this.state = state;
        this.zipcode = zipcode;

    }

    public boolean equals(Object otherObject)
    {
        if(otherObject == this)
        {
            return true;
        }
        if(otherObject != this)
        {
            return false;
        }
        return true;
    }

    public String getAddress()
    {
        return address;
    }

    public void setAddress(String addr)
    {
        this.address = addr;
    }

    public String getCity()
    {
        return city;
    }

    public void setCity(String city)
    {
        this.city = city;
    }

    public String getState()
    {
        return state;
    }

    public void setState(String state)
    {
        this.state = state;
    }

    public String getZipcode()
    {
        return zipcode;
    }

    public void setZipcode(String zipcode)
    {
        this.zipcode = zipcode;
    }

}

你只是在檢查身​​份,這不是你想要的。 看看這個關於實現equals()的好參考 :正如他們所提到的那樣

equals通常應該比較狀態,而不是身份。 對於映射到數據庫記錄的“以數據為中心”的類尤其如此。

在這個例子中,我重寫了hashCode,toString和equals。 我的標准是equals應該使用someClass的someAttribute來定義所述類實例之間的de equals()。 HashCode應該以相同的方式與equals一起重新定義。

@Override
public String toString() {
     return "SomeClass [attribute=" + someAttribute + "]";
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + someAttribute;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (obj == null)
        return false;       
    if (this == obj)
        return true;

    if (getClass() != obj.getClass())
        return false;
    SomeClass other = (SomeClass) obj;
    if (someAttribute != other.someAttribute)
        return false;
    return true;
}

這種問題已被無數次回答。

如果您使用的是Eclipse IDE,它會為您提供默認情況下生成,equals,hashCode和toString函數的功能。

你還必須在equals方法中使用某種類變量來進行比較。

請做一個谷歌搜索被這個話題的無數結果吹走

當應用於Object的實例時, ==運算符檢查是否在對該Object同一實例的兩個引用之間進行比較。 如果使用相同的地址,城市,州和郵政編碼創建了兩個Address實例,則==運算符在用於比較這兩個不同的實例時將返回false 您需要使用函數覆蓋Address上的equals()以顯式檢查4個字段中的每個字段是否匹配,並在這種情況下返回true

構建一個聲音equals()重寫實現是很難的,你應該檢查其他海報提供的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM