method - java enum values




Java枚舉-為什麼使用toString而不是名稱 (4)

name()實際上是枚舉的java代碼中的文本名稱。 這意味著它僅限於實際出現在您的java代碼中的字符串,但並非所有期望的字符串都可以用代碼表示。 例如,您可能需要一個以數字開頭的字符串。 name()將永遠無法為您獲取該字符串。

如果你查看方法name()的enum API,它會說:

返回此枚舉常量的名稱,與其枚舉聲明中聲明的完全相同。 大多數程序員應該優先使用toString方法,因為toString方法可能會返回一個更加用戶友好的名稱。 此方法主要用於專門的情況,其中正確性取決於獲取確切的名稱,從發佈到發布不會有所不同。

為什麼使用toString()更好? 我的意思是,當name()已經是final時,toString可能被覆蓋。 所以,如果你使用toString,並且有人重寫它以返回一個硬編碼的值,那麼你的整個應用程序就關閉了。另外,如果你查看源代碼,toString()方法會返回完全正確的名稱。 這是同一件事。


name()enum的“內置”方法。 它是最終的,你不能改變它的實現。 它在寫入時返回枚舉常量的名稱,例如大寫,不含空格等。

比較MOBILE_PHONE_NUMBERMobile phone number 。 哪個版本更具可讀性? 我相信第二個。 這是區別: name()總是返回MOBILE_PHONE_NUMBERtoString()可能會被overriden返回Mobile phone number


當你想進行比較時使用name() ,或者在代碼中使用硬編碼的值作為內部使用。

當您想要向用戶展示信息時(包括查看日誌的開發人員toString() ,請使用toString() )。 永遠不要依靠toString()給出特定值的代碼。 切勿對特定的字符串進行測試。 如果你的代碼在有人正確更改toString()返回時中斷,那麼它已經被破壞。

從javadoc(強調我的):

返回對象的字符串表示形式。 通常,toString方法返回一個“文本表示”該對象的字符串。 結果應該是一個簡潔但內容豐富的表述,對於一個人來說很容易閱讀建議所有子類重寫此方法。


這實際上取決於你想要對返回值做什麼:

  • 如果您需要獲取用於聲明枚舉常量的確切名稱,則應該使用name()作為toString可能已被覆蓋
  • 如果你想以一種用戶友好的方式打印枚舉常量,你應該使用可能被覆蓋(或不是!)的toString

當我覺得它可能會令人困惑時,我提供了一個更具體的getXXX方法,例如:

public enum Fields {
    LAST_NAME("Last Name"), FIRST_NAME("First Name");

    private final String fieldDescription;

    private Fields(String value) {
        fieldDescription = value;
    }

    public String getFieldDescription() {
        return fieldDescription;
    }
}






enums