[英]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.