日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不可将您的方法命名为“等于”

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不可将您的方法命名为“等于” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(當然,除非您確實重寫了Object.equals() )。

我偶然發現了用戶Frank的一個非常奇怪的Stack Overflow問題 :

為什么Java的Area#equals方法不能覆蓋Object#equals?

有趣的是,有一個Area.equals(Area)方法實際上采用Area參數,而不是Object.equals()聲明的Object參數。 弗蘭克(Frank)發現,這會導致令人討厭的行為:

@org.junit.Test public void testEquals() {java.awt.geom.Area a = new java.awt.geom.Area();java.awt.geom.Area b = new java.awt.geom.Area();assertTrue(a.equals(b)); // -> truejava.lang.Object o = b;assertTrue(a.equals(o)); // -> false }

從技術上講,以這種方式實現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

總結

以上是生活随笔為你收集整理的不可将您的方法命名为“等于”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。