2010-08-31 29 views
1

我有以下枚舉:爲什麼myEnum.ONE不等於myEnum.ONE.toString()?

public enum myEnum { 
    ONE("ONE"), TWO("TWO"); 

    private String name; 

    private myEnum(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
}; 

我的問題是,爲什麼下面評估爲假的?我懷疑它與equals()方法的實現有關。

(myEnum.ONE).equals(myEnum.ONE.toString()) 
+0

你爲什麼期望它評估爲「真」?我認爲你需要退後一步,真正理解Java中如何使用equals和hashCode。它們是Java中最重要的兩個合同。 – polygenelubricants 2010-08-31 23:17:23

回答

5

一般來說,不同類型的對象並不相同,因爲爲了滿足等式約定規定的對稱性,兩個類必須相互瞭解。此外,因爲平等必須是過渡性的(這也是等同合同的強制要求),所以引入你的規則會產生奇怪的後果。試想一下:

enum Color { 
    green, red, blue; 
} 

enum Experience { 
    green, novice, veteran; 
} 

應該Color.green等於Experience.green?可能不會,因爲經驗和顏色是非常不同的東西。但是,如果"green".equals(Color.green)"green".equals(Experience.green),Color.green必須等於Experience.green

所以一般規律是:不相關類型的對象是不相等的。

+0

+1:「對於equals()的對稱性,兩個類都必須知道彼此」。 – tangens 2010-09-01 06:22:54

3

是的,這是equals()方法。對於Enum它看起來像這樣:

public final boolean equals(Object other) { 
    return this==other; 
} 

現在,你的結果是顯而易見的:一個枚舉是不相同的對象toString()方法的結果。

1

在你的表達式中,左邊的值是一個枚舉。右側的值是一個字符串。

較長的答案是.equals在默認情況下評估的意思是「同一個對象的同一個實例」,除非你明確用不同的評估形式覆蓋它。在emum的情況下,它們本質上是保證enum中每個元素的單個實例值的句法糖。因此,枚舉等於看看它是否是相同的元素。

因此,MyENum.ONE是對MyEmum實例的引用,其中只有一個實例。任何時候你有一個MyEnum.ONE它都是同一個實例。如果你問它是否與其他東西相同,它只會響應MyEnum.ONE實例。

相關問題