将枚举常量与没有valueOf或toString的字符串进行比较?

问题描述:

我有我已经在下面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

那么,在第一个比较,你在呼唤一个枚举类型,默认返回的枚举的名称的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; 
} 

因此,它不等于,因为其他字符串枚举

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