2017-05-09 95 views
-1

我有我已經在下面way-將枚舉常量與沒有valueOf或toString的字符串進行比較?

String myVariable ="MY_CONSTANT1"; 
System. out.println(MyEnum.MY_CONSTANT1.toString().equals(myVariable)); 

以上返回true,這是可以理解定義一些常量

public enum MyEnum{ 
    MY_CONSTANT1, 
    MY_CONSTANT2 
} 

現在比較字符串枚舉常量之一任何枚舉。

現在,當我做下面----

String myVariable ="MY_CONSTANT1"; 
System.out.println(MyEnum.MY_CONSTANT1.equals(myVariable)); 

上面的代碼返回false。爲什麼這樣?

+5

因爲您正在比較不同類型的對象。 'MY_CONSTANT1'是'MyEnum'類型的實例,'myVariable'是'String'。爲什麼這些都是平等的? – Pshemo

+0

順便說一下,儘管'toString()'在這種情況下起作用,最好使用設計用於返回名稱爲name()的枚舉值的方法。所以你應該使用'MyEnum.MY_CONSTANT1.name()。equals(myVariable)',或者如果你的目標是找到指定名稱的枚舉,你可以使用'MyEnum.valueOf(myVariable)'。 – Pshemo

+0

@Pshemo好吧,我感到困惑。我認爲枚舉不斷內部得到遵守字符串。所以我認爲比較應該是罰款..看起來像這樣的情況..枚舉常量有枚舉的類型 – user2713255

回答

1

那麼,在第一個比較,你在呼喚一個枚舉類型,默認返回的枚舉的名稱的toString方法:

System.out.println(MyEnum.MY_CONSTANT1.toString().equals(myVariable)); 

所以,MyEnum.MY_CONSTANT1.toString()是「MY_CONSTANT1」 。然後「MY_CONSTANT1」等於「MY_CONSTANT1」,這是正確的。

另一方面,第二個比較是Enum類型和String類型之間的比較。枚舉等於函數執行以下代碼:

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

因此,它不等於,因爲其他字符串枚舉

2

Here's的Javadoc枚舉的equals()方法,這就是它說:

public final boolean equals(Object other) 

返回true如果指定對象等於此枚舉常量。現在

,如果我們考慮的equals()implementation,這是它做什麼:

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

我們可以看到,它只是檢查兩個引用是否指向同一對象或沒有。由於所涉及的兩個參考文獻不同,它將返回false

+0

好吧,我感到困惑。我認爲枚舉不斷在內部得到遵守的字符串。所以我認爲比較應該是罰款..看起來像這樣的情況.. enum常量有枚舉的類型 – user2713255

+0

不能,'enum'不會被編譯爲'字符串' ,'enum'是單獨的類型,即使在編譯之後,它仍然是'enum'。 –

+0

@ user2713255只是要清楚,一般來說'enum NameOfEnum {...}'只是語法糖,它在編譯後會被'final class NameOfEnum {...}'替代,它的常量將是'public static final NameOfEnum FIELD_NAME =新的NameOfEnum();'字段。 – Pshemo

相關問題