簡體   English   中英

java中.equals()方法的假設 - 比較對象的實例或對象的狀態

[英]Assumptions for .equals() method in java - compare object's instance or object's state

在假設中確切地識別.equals()方法是什么:對象的實例或對象的狀態?

我正在學習Hibernate和JPA。 當我想使用雙向OneToMany關聯時,存在一個問題,因為當我用所有變量覆蓋equal和HashCode方法時,會變成無限循環。 解決我遇到的問題的唯一方法是不在其中一個類中使用equals()和hashCode()中的另一個類實例。 所以我在考慮它是否與Java中針對.equals()方法的假設兼容。

例如,我們有一個Person類()。 我知道電子郵件是獨特的價值。 所以我可以通過電子郵件比較人,然后我知道它是同一個人(實例)但我不知道對象的狀態是否相同(firstName和lastName字段可以不同)。 所以這是我的問題,在比較對象與.equals()期間我們應該期待什么?

@Entity
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String email="";
    private String firstName = "";
    private String lastName = "";

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return email.equals(person.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(email);
    }
}

當我想到為給定的類實現equals ,我問自己一個問題:什么使對象獨特? 一個Person與其他Person不同的例子有什么不同? 然后我使用該屬性來實現equals 在你的情況下,或者@Entity對象與@XtoY關系的情況下,在我看來,沒有必要將這種關系包括在equals

例如,如果我有一個與Department有關系的Person ,那么一個人屬於某些部門的事實並不能使他成為唯一的。 這是他的名字/姓氏/ PESEL或電子郵件等等,這就是我在equals所包含的內容。

希望這可以幫助。

equals()的默認實現是:

public boolean equals(Object obj) {
        return (this == obj);
    }

因此,如果電子郵件相同,則重寫的equals()將返回true。

暫無
暫無

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

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