簡體   English   中英

在 Java 中的枚舉中使用等於字符串

[英]Using equals with string in enum in Java

假設我們有下一個枚舉,我想向它添加 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);
    }
}

問題:使用這樣的方法有什么陷阱嗎?

某些綁定到equals(..)的合同將被違反。 特別對稱 這可能會導致將來出現各種問題。

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

我建議不要支持錯過使用equals(..) 'other people' do。

要盡早找到使用 equals(String ) 的代碼,您可以這樣做:

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

@Deprecated大多數 IDE 會將任何調用標記為警告。


更新
正如davidxxx在他的評論和回答中所寫的那樣,如果您使用例如聲納,聲納的警告足以解決您的問題,而無需添加我在上面作為解決方案提供的“死代碼”。

不建議添加此方法以避免標准方法的錯誤使用,如equals()
此外,即使你在SomeEnum類中添加了這個方法,你也不能也不想在String類中做同樣的事情!
所以"DATABASE_CONSTANT1".equals(SomeEnum.DATABASE_CONSTANT1)仍然是可能的,並且不會返回你想要的。

我認為 Lint 和代碼分析工具作為 Sonar 可以更好地處理不良做法。

例如,Sonar 定義了Silly 相等性檢查不應該被制定的bug 規則。
這會對您需要的equals()用法進行多次檢查:

比較不相關的類

這是有關它的更多詳細信息:

不同類型的比較將始終返回 false。 可以簡單地刪除比較及其所有相關代碼。 這包括:

將對象與 null 進行比較

將一個對象與一個不相關的原語進行比較(例如一個帶有 int 的字符串)

比較不相關的類

比較不相關的類和接口

比較不相關的接口類型

將數組與非數組進行比較

比較兩個數組

暫無
暫無

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

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