枚举:如何正确使用name()和toString()方法
兩種方法之間的區別?
Java枚舉有兩種方法來檢索枚舉常量的值: name()和.toString() 。 toString()方法調用name()方法,該方法返回枚舉常量的字符串表示形式。 在清單1中,通過在Animal.DOG常量方法上調用name()和toString()返回的值是DOG 。
清單1:動物枚舉
public enum Animal {DOG }// Unit test assertThat(DOG.toString()).isEqualTo(DOG.name());因此,鑒于兩種方法都返回相同的值,您可能會認為它們可以互換使用,并且在大多數情況下,這是正確的。 但是,這兩種方法之間的區別很重要。
有什么不同?
name()方法是最終的,因此不能被覆蓋,相反, toString()方法是打開的并且可以被覆蓋。 實際上,鼓勵重寫toString()方法。 應該實現它并返回友好的枚舉常量版本。 清單2顯示了如何完成此操作。
清單2:覆蓋toString()方法
public enum Animal {DOG {public String toString() {return "Dog";}} }// Unit test assertThat(DOG.toString()).isNotEqualTo(DOG.name());在Animal.DOG枚舉常量上調用toString()的輸出為Dog 。 因此,現在name()方法和toString()方法不會返回相同的值。
Java文檔怎么說
讓我們更深入地研究一下Java文檔,該文檔建議:
大多數程序員應該優先于name()方法使用toString()方法,因為toString()方法可能返回更用戶友好的名稱。
這就提出了一個問題。 什么時候應該使用.name()方法?
根據Java文檔:
name()方法主要設計用于特殊情況,在這些情況下正確性取決于獲得確切的名稱,而不同的發布版本之間并不會有所不同。
那么他們指的是什么特殊情況? valueOf()方法可能會給我們提示。 此方法采用String值,并嘗試查找與之完全匹配的枚舉。 看一下清單3中的代碼。
清單3:valueOf()方法返回DOG
assertThat(DOG).isEqualTo(Animal.valueOf("DOG"));傳遞給valueOf()方法的String值必須與枚舉常量完全匹配,否則將引發IllegalArgumentException 。
源代碼
本文的代碼示例和單元測試存儲在GitHub存儲庫ReadLearnCode / readlearncode_articles中 。
結論
當基于字符串值填充枚舉字段時,這是一種非常有用的方法。 何時執行此操作的一個示例是在反序列化包含枚舉常量的JSON文檔時。 在這種情況下,應使用name()方法以保持往返等效性。
您不能保證toString()方法不會被覆蓋,但是name()方法將始終返回枚舉的字符串等效項。
進一步閱讀
您可能對我的文章“策略模式的枚舉實現”感興趣。
翻譯自: https://www.javacodegeeks.com/2017/09/enum-use-name-tostring-methods-correctly.html
總結
以上是生活随笔為你收集整理的枚举:如何正确使用name()和toString()方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u深度怎么装win10系统(u深度装wi
- 下一篇: Win11怎么安装IrDA红外线功能(W