我有两个枚举:
root.fetch("parentObj", JOIN.LEFT);
public enum UserType {
USER,
EMPLOYER
}
我尝试以此比较:
public enum UserDetails {
USER,
EMPLOYER
}
但是我不能,因为我的if(UserType.USER.equals(UserDetails.USER)){
return true;
}
给我扔了:
equals()
那么,如何比较两个不同枚举中的两个值?
答案 0 :(得分:5)
enum in Java是class,尽管是一种稍微特殊的类。一个类定义一个type。
除非与inheritance或interface相关,否则无法比较不同类型的相等性。 String
不能等于LocalDate
,而不能等于DataSource
。
同样,枚举UserType
的对象不能等于枚举UserDetails
的对象。 Apples to oranges,根据定义不相等。因此,从技术上讲,您的问题是毫无意义的。
某些枚举类恰巧在其某些常量上共享名称这一事实没有任何意义,这只是您两个枚举共享名称USER
或EMPLOYER
的巧合。与Java捆绑在一起的枚举Month
定义了一个名为APRIL
的常量。我可以用一个也名为APRIL
的对象定义另一个枚举。但这并不能使他们平等。
问这个问题表明您的设计有问题。也许您应该在该设计问题上发布另一个问题,如果该问题已经在Stack Overflow上解决了。作为commented by Kayaman,您的问题似乎像一个XY Problem。
其他答案提示您
...被误导了。这些方法违反了Java枚举的目的,即提供type-safe处已知值的compile-time标识。
String
对象而不是枚举。 这两种情况都很脆弱,如果更改一个枚举而不匹配另一个枚举,则会导致运行时失败。在这两种情况下,您都失去了枚举的用处,将枚举转化为字符串或int
的令人困惑的间接寻址级别。
答案 1 :(得分:4)
尝试比较他们的名字
if(UserType.USER.name().equals(UserDetails.USER.name())){
return true;
}
阅读其他答案,我决定提供更多扩展答案。我必须同意,这样的解决方案还不够好,因为它与枚举无关-与字符串比较有关。枚举可能会更改,everythig将无法正常工作。好。 我认为可能会有更好的解决方案-当然:
enum UserType {
USER,
EMPLOYER;
public boolean isLike(UserDetails details) {
switch (this) {
case USER:
return details == UserDetails.USER;
case EMPLOYER:
return details == UserDetails.EMPLOYER;
}
return false;
}
}
enum UserDetails {
USER,
EMPLOYER;
}
if(UserType.USER.isLike(UserDetails.USER)){
// do something
}
因此,我们看到没有比重写代码并只编写一个enum
更好的决定了。但是一切都取决于问题: