2015-10-25 42 views
0

一些Java API類不覆蓋對象equals方法造成虛假的平等:爲什麼一些不重寫對象Java API類等於/ toString方法

import java.util.Locale; 
import static java.util.Locale.Builder; 

public class Localization { 
    public static void main(String[] args) { 
     Builder b = new Builder();//.setLanguage("sr").setScript("Latn").setRegion("RS").build(); 
     Builder b1 = b.setLanguage("se"); 
     b.setScript("latn"); 
     b.setRegion("RS"); 
     Builder b2 = new Builder(); 
     b2.setLanguage("se"); 
     b2.setScript("latn"); 
     b2.setRegion("RS"); 
     Locale l = b.build(); 
     System.out.println(l); 
     System.out.println(b == b1); //<-- true 
     System.out.println(b.equals(b1));//<-- true 

     System.out.println(b == b2);//<-- FALSE 
     System.out.println(b.equals(b2));//<-- **STILL FALSE WHY?** 

     System.out.println(b.toString());//<- this will return [email protected] 
     System.out.println(b2.toString());//<- this will return [email protected] 
     System.out.println(b.toString().equals(b2.toString()));//<- this will print false bacause of [email protected] values return by toString 
    } 
} 

我很困惑,爲什麼一些在Java API的類的做不覆蓋對象等於方法? 這就是爲什麼b.equals(b2)即使具有確切值仍然返回false的原因,我見過其他一些類,但現在這將成爲我的示例。

是因爲Builder模式嗎?或其他原因?肯定他們有這個理由。

+1

爲什麼任何人都應該浪費時間寫比較器來比較很少比較的對象呢?編寫代碼必須有一個理由 - 這是一種需求,但除了學術興趣之外,這些方法沒有任何需求。如果你的邊緣案例確實需要它,你可以隨時擴展課程並添加你自己的課程,但是我認爲你會發現它太痛苦了,而且需要很長時間,所以你會放棄並最終意識到,首先需要它。 –

+0

U可能是正確的,但它很難接受提供一些事實的答案,我試圖與JLS 8一起掃描,但無法找到任何可能導致這種情況的原因,我懷疑也許Java API開發人員沒有清楚/明確的規範這些類將如何在它的確切值方面是相等的,當然使用==相等性將總是返回false givin對象a和b都是使用新的關鍵字創建的。應該有這樣的理由,甲骨文必須披露,首先Java是一種面向對象的語言,其中的一切都有存在的理由。 –

+0

如果你想了解這個特定類的事實,你需要問問作者,而不是StackOverflow。如果你想要關於普通課程的一般事實,你已經擁有了它們。實現額外的代碼,以便人們可以比較Locale構建器在任何人的優先級列表中都不會很高,包括我的。 – EJP

回答

2

通常只有在通常比較的東西上覆蓋equals纔有意義。至於toString,有時沒有一個特別有用的字符串版本的對象比默認(畢竟,這是默認的原因)。

當我編寫Java時,我在比較的方式(我覆蓋toString出於調試目的,IntelliJ自動顯示它)上覆蓋所有對象上的equalstoString。例如,如果我需要根據Object中的某些屬性檢查兩件事是否匹配。這些類通常是POJO。對於其他人來說,感覺就像是浪費時間(例如,util類),特別是考慮到當你覆蓋equals時,建議覆蓋hashCode - 當你不必真正需要時,這只是很多額外的事情。

相關問題