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