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模式嗎?或其他原因?肯定他們有這個理由。
爲什麼任何人都應該浪費時間寫比較器來比較很少比較的對象呢?編寫代碼必須有一個理由 - 這是一種需求,但除了學術興趣之外,這些方法沒有任何需求。如果你的邊緣案例確實需要它,你可以隨時擴展課程並添加你自己的課程,但是我認爲你會發現它太痛苦了,而且需要很長時間,所以你會放棄並最終意識到,首先需要它。 –
U可能是正確的,但它很難接受提供一些事實的答案,我試圖與JLS 8一起掃描,但無法找到任何可能導致這種情況的原因,我懷疑也許Java API開發人員沒有清楚/明確的規範這些類將如何在它的確切值方面是相等的,當然使用==相等性將總是返回false givin對象a和b都是使用新的關鍵字創建的。應該有這樣的理由,甲骨文必須披露,首先Java是一種面向對象的語言,其中的一切都有存在的理由。 –
如果你想了解這個特定類的事實,你需要問問作者,而不是StackOverflow。如果你想要關於普通課程的一般事實,你已經擁有了它們。實現額外的代碼,以便人們可以比較Locale構建器在任何人的優先級列表中都不會很高,包括我的。 – EJP