不可将您的方法命名为“等于”
(當然,除非您確實重寫了Object.equals() )。
我偶然發現了用戶Frank的一個非常奇怪的Stack Overflow問題 :
為什么Java的Area#equals方法不能覆蓋Object#equals?
有趣的是,有一個Area.equals(Area)方法實際上采用Area參數,而不是Object.equals()聲明的Object參數。 弗蘭克(Frank)發現,這會導致令人討厭的行為:
從技術上講,以這種方式實現AWT的Area是正確的(因為也沒有實現hashCode() ),但是Java解析方法的方式以及程序員摘要已像上述代碼一樣編寫的代碼的方式是重載equals方法確實是一個可怕的主意。
也沒有靜態等于
這些規則也適用于靜態equals()方法,例如Apache Commons Lang的
ObjectUtils.equals(Object o1, Object o2)由于您無法靜態導入此equals方法,因此造成了混亂:
import static org.apache.commons.lang.ObjectUtils.equals;現在,輸入以下內容:
equals(obj1, obj2);您將得到一個編譯器錯誤:
Object類型中的equals(Object)方法不適用于參數(…,…)
這樣做的原因是,在當前類及其父類型范圍內的方法將始終隱藏以這種方式導入的任何內容。 以下內容也不起作用:
import static org.apache.commons.lang.ObjectUtils.defaultIfNull;public class Test {void test() {defaultIfNull(null, null);// ^^ compilation error here}void defaultIfNull() {} }此堆棧溢出問題中的詳細信息 。
結論
結論很簡單。 永遠不要重載Object聲明的任何方法 (當然可以重寫)。 這包括:
- clone()
- equals()
- finalize()
- getClass()
- hashCode()
- notify()
- notifyAll()
- toString()
- wait()
當然,如果不首先在Object中聲明這些方法,那將是很棒的事情,但是那艘船已經航行了20年。
翻譯自: https://www.javacodegeeks.com/2015/02/thou-shalt-not-name-thy-method-equals.html
總結
以上是生活随笔為你收集整理的不可将您的方法命名为“等于”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企鹅直播tv怎么用?企鹅tv直播平台使用
- 下一篇: Neo4j:带密码的TF / IDF(和