在Java

时间:2018-02-15 14:37:59

标签: java enums equals

假设我们有下一个枚举,并且我想向它添加equals(String)方法,因为使用相同代码的其他人通常会使用equals方法将枚举与字符串进行比较时出错。

public enum SomeEnum {
    CONSTANT1("DATABASE_CONSTANT1"),
    CONSTANT2("DATABASE_CONSTANT2");

    private final String databaseConstant;

    SomeEnum(String databaseConstant) {

        this.databaseConstant = databaseConstant;
    }

    public String getDatabaseConstant() {
        return databaseConstant;
    }

    public boolean equals(String databaseConstant) {
        return getDatabaseConstant().equals(databaseConstant);
    }
}

问题:使用这种方法有什么陷阱吗?

2 个答案:

答案 0 :(得分:2)

某些绑定到equals(..)的合同将被违反。 特别是对称。这可能会在将来导致各种问题。

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

我建议不要支持错过使用equals(..) '其他人'

要尽早找到使用equals(String)的代码,您可以这样做:

@Deprecated
public boolean equals(String databaseConstant) {
  throw new IllegalArgumentException("Never use equals(String) for SomeEnumtype "); 
}

@Deprecated将大多数IDE将任何调用标记为警告。

<强>更新
正如davidxxx在他的评论中所写的那样如果你使用例如回答声纳声纳的警告足以应对您的问题,而无需添加“死代码”#39;我提出了上述解决方案。

答案 1 :(得分:1)

不建议添加此方法以避免错误地使用标准方法equals() 此外,即使您在SomeEnum课程中添加了此方法,也不能也不想在String课程中执行相同操作! 所以"DATABASE_CONSTANT1".equals(SomeEnum.DATABASE_CONSTANT1)仍有可能,并且不会返回您想要的内容。

我认为作为Sonar的Lint和代码分析工具可以更好地处理不良做法。

例如,Sonar定义了Thread错误规则 这会对您需要的equals()用法进行多次检查:

  

比较不相关的类

以下是有关它的更多细节:

  

不同类型的比较将始终返回false。该   可以简单地删除比较及其所有相关代码。这个   包括:

     

将对象与null进行比较

     

将一个对象与一个不相关的原语进行比较(E.G.一个带有一个字符串的字符串)   INT)

     

比较不相关的类

     

比较不相关的类和接口

     

比较不相关的接口类型

     

将数组与非数组进行比较

     

比较两个数组