簡體   English   中英

在JAVA中檢查ENUM值與字符串是否相等

[英]Check equality of a ENUM value with a String in JAVA

我知道正確的方法是Days.MONDAY.name().equals(day) 但是我不知道為什么當Days.MONDAY.equals(day)都打印MONDAY時失敗。

我知道我缺少帶有equals()和toString()的東西。 我想清楚地知道這是什么。

String day = "MONDAY";
System.out.println("main().Days.MONDAY : " + Days.MONDAY); // Prints MONDAY
System.out.println("main().day : " + day);// Prints MONDAY

System.out.println("main().Days.MONDAY.equals(day) : " + Days.MONDAY.equals(day)); // Why is this false when below is OK.
System.out.println("main().Days.MONDAY.toString().equals(day) : " + Days.MONDAY.toString().equals(day));// This is true
System.out.println("main().Days.MONDAY.name().equals(day) : " + Days.MONDAY.name().equals(day)); // This is true and I know this is the correct way

編輯:這是枚舉。

enum Days{
    MONDAY,TUESDAY,WEDENSDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}

枚舉的equals方法比較枚舉的靜態實例。 因為Enum的任何表示都指向同一對象實例。 因此,Enum的equals方法不比較Name或toString,它比較實例。

String day="MONDAY";

上一行在Constant Pool中創建Object ,其中as

public enum Days{
MONDAY  <-- Created in HEAP
}

現在來

Days.MONDAY.equals(day) --> Why False ?

equals()枚舉的方法的實例進行比較Enum不是data作為String#equals()確實!!

Days.MONDAY.toString().equals(day) --> Why true ?

因為它是String#equals()方法,所以它被重載了!

看看可以在Java枚舉中使用它 基於此,Java在Enum上的equals實現僅執行==。 由於示例中的Enum和String day不是同一對象,因此它返回false。

Object類的方法具有嚴格定義的協定。

這些方法之一是Object.equals()方法-這是其文檔

為了能夠保持對稱性要求,幾乎不可能在equals()任何實現中都返回true ,除非要比較的兩個對象屬於同一類。 equals()應該表示它們的屬性之間的某種等效形式,但是不屬於同一類的對象不具有相同的屬性。

不要將Days對象Days.MONDAYDays.MONDAY.toString()返回的字符串混淆。 它的toString()僅返回表示它的字符串,並且兩個字符串是可以相等的對象。 但是Days.MONDAY.toString() 並不是對象本身(嘗試Days.MONDAY.equals( Day.MONDAY.toString() ) ,您在這里也會得到錯誤!

當您將對象發送到System.out或任何其他PrintWriterprint()println()方法時, print()將采用該對象的toString()值並進行打印。 這就是為什么他們“打印相同的東西”的原因。 實際上並不是要打印的MONDAY對象(很難定義“打印對象”),而是從其toString()方法返回的字符串"MONDAY"

即使Days不是枚舉,而是不是字符串的其他對象,所有這一切都將成立,盡管在枚舉的特定情況下,其equals()方法實際上是引用而不是屬性的比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM