Equals
在實現 equals
這個方法之前, 應該先想的是怎樣才算是相等?
先看個例子
http://openhome.cc/Gossip/JavaEssence/ObjectEquality.htmlString s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // 顯示 false
System.out.println(s1.equals(s2)); // 顯示 true
使用 Apache commons
可以協助更快的定義 entity 的差異, 比如說 Item(商品),
用商品的 uId
來定義是否相等。
文章建議, 在定義 equals()
的同時, 最好也定義 hashCode()
,
這是兩件不同的事情, hashCode()
就像物件的身分證, 會更嚴格的處理物件身份的問題,
在 Collection
類的操作會常用到。
隨便的例子
package entitys;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
/**
* Created by jerry on 2017/9/22.
*/
@Data
@AllArgsConstructor
public class Apple {
private String name;
private String type;
private String price;
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Apple)) {
return false;
}
if(obj == this) {
return true;
}
Apple other = (Apple) obj;
return new EqualsBuilder()
.append(this.getName(), other.getName())
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 31) // two randomly chosen prime numbers
.append(this.getName()) // if deriving: appendSuper(super.hashCode()).
.append(this.getPrice())
.toHashCode();
}
}
@Test
public void test1() {
Apple item1 = new Apple("apple", "fruit", "10");
Apple item2 = new Apple("apple", "fruit", "15");
Apple item3 = new Apple("pear", "fruit", "10");
// 只要 name 屬性一樣, 就是 equal
Assert.assertEquals(item1, item2);
// 奧萊仔假朋個, 就不 equal
Assert.assertFalse(item1.equals(item3));
}
@Test
public void test2() {
Set items = new HashSet<>();
Apple item1 = new Apple("apple", "fruit-a", "10");
Apple item2 = new Apple("apple", "fruit-b", "10");
// 在購物車裡面放兩個, 不同 type 屬性的蘋果
items.add(item1);
items.add(item2);
// 結果只有一顆, [Apple(name=apple, type=fruit-a, price=10)]
System.out.println(items);
}
沒有留言:
張貼留言