日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

枚举:如何正确使用name()和toString()方法

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 枚举:如何正确使用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()方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。