使用JAVA中的String检查ENUM值的相等性

Check equality of a ENUM value with a String in JAVA

我知道正确的方法是Days.MONDAY.name().equals(day)。但我想知道为什么两个星期一打印的时候,Days.MONDAY.equals(day)都失败了。

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

1
2
3
4
5
6
7
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

编辑:这是枚举。

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


枚举的equals方法比较枚举的静态实例。因为枚举的任何表示都指向同一对象实例。因此,枚举的equals方法没有比较名称,也没有对实例进行ToString比较。


Object的方法有一个严格定义的契约。

其中一种方法是Object.equals()方法——这里是它的文档。

为了保持对称性要求,在equals()的任何实现中,几乎不可能返回true,除非被比较的两个对象属于同一类。equals()应该表示属性之间的某种等价物,但不属于同一类的对象不具有相同的属性。

不要将Days对象Days.MONDAY与从Days.MONDAY.toString()返回的字符串混淆。它的toString()只返回一个表示它的字符串,两个字符串是可以相等的对象。但是Days.MONDAY.toString()不是对象本身(试试Days.MONDAY.equals( Day.MONDAY.toString() ),你在这里也会弄错的!

当你发送一个对象到print()println()方法的System.out或任何其他PrintWriter时,print()将获取该对象的toString()值并打印出来。这就是为什么他们"打印相同的东西"的原因。实际上打印的不是MONDAY对象(很难定义"打印对象"),而是从其toString()方法返回的字符串"MONDAY"

即使Days不是枚举,而是一些不是字符串的其他对象,所有这些都是正确的,尽管在枚举的特定情况下,其equals()方法实际上是引用而不是属性的比较。


看看在Java中使用枚举是可以的。基于此,Java在EnUM上实现等值仅执行= =。由于示例中的枚举和String day不是同一个对象,所以返回false。


1
String day="MONDAY";

上面的行在常量池中创建Object,其中as

1
2
3
public enum Days{
MONDAY  <-- Created in HEAP
}

现在来到

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

枚举的equals()方法将Enum的实例与data的实例进行比较,与String#equals()的实例进行比较!!

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

因为它是String#equals()方法,它被重载了!!