我們在寫一個JavaBean時,經常會覆寫equals方法,其目的是根據業務規則判斷兩個對象是否相等,比如我們寫一個Person類,然後根據姓名判斷兩個執行個體對象是否相同,這在DAO(Data Access Objects)層是經常用到的。具體操作是先從資料庫中獲得兩個DTO(Data Transfer Object,資料傳輸對象),然後判斷它們是否是相等的,代碼如下:


覆寫的equals做了多個校驗,考慮到從Web上傳遞過來的對象有可能輸入了前後空格,是以用trim方法剪切一下,看看代碼有沒有問題,我們寫一個main:


上面的代碼産生了兩個Person對象(注意p2變量中的那個張三後面有一個空格),然後放到List中,最後判斷List是否包含了這兩個對象。看上去沒有問題,應該列印出兩個true才是,但是結果卻是:
剛剛放到list中的對象竟然說沒有,這太讓人失望了,原因何在呢?List類檢查是否包含元素時是通過調用對象的equals方法來判斷的,也就是說constains(p2)傳遞進去,會依次執行p2.equals(p1)、p2.equals(p2),隻要有一個傳回true,結果就是true,可惜的是比較結果都是false,那問題就出來了:難道p2.equals(p2)也為false不成?
還真說對了,p2.equals(p2)确實是false,看看我們的equals方法,它把第二個參數進行了剪切!也就是說比較的是如下等式:
注意前面的“張三 ”是有空格的,那這個結果肯定是false了,錯誤也就此産生了。這是一個想做好事卻辦成了“壞事”的典型案例,它違背了equals方法的自反性原則:對于任何非空引用x,x.equals(x)應該傳回true。
問題知道了,解決也非常容易,隻要把trim()去掉即可,注意解決的隻是目前問題,該equals方法還存在其他問題。
本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/5431153.html,如需轉載請自行聯系原作者