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