Java中枚舉的toString()和name()區(qū)別小結(jié)
一、引言
在 Java 里,枚舉類(lèi)型是一種特殊的類(lèi),toString() 與 name() 方法都和枚舉常量有關(guān),但它們存在一些區(qū)別,下面為你詳細(xì)介紹
二、介紹
- name() 方法
定義:name() 是 java.lang.Enum 類(lèi)里的一個(gè)方法,所有枚舉類(lèi)型都能繼承該方法。它的作用是返回枚舉常量的名稱(chēng),也就是在枚舉聲明中定義的標(biāo)識(shí)符。
特點(diǎn):返回值是固定的,不會(huì)受 toString() 方法重寫(xiě)的影響,始終返回枚舉常量在代碼中定義的原始名稱(chēng)。 - toString() 方法
定義:toString() 是 java.lang.Object 類(lèi)中的方法,所有 Java 類(lèi)都有該方法。在枚舉類(lèi)型中,默認(rèn)情況下,toString() 方法的行為和 name() 方法一樣,會(huì)返回枚舉常量的名稱(chēng)。不過(guò),你可以重寫(xiě)這個(gè)方法,讓它返回更具描述性的字符串。
特點(diǎn):可以根據(jù)需求重寫(xiě),從而返回更有意義的信息,而不局限于枚舉常量的原始名稱(chēng)。
下面的示例展示了 name() 和 toString() 方法的使用:
// 定義一個(gè)表示季節(jié)的枚舉
enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER;
// 重寫(xiě) toString() 方法,讓其返回更具描述性的字符串
@Override
public String toString() {
switch (this) {
case SPRING:
return "春季";
case SUMMER:
return "夏季";
case AUTUMN:
return "秋季";
case WINTER:
return "冬季";
default:
return super.toString();
}
}
}
public class EnumExample {
public static void main(String[] args) {
Season season = Season.SPRING;
// 使用 name() 方法獲取枚舉常量的原始名稱(chēng)
System.out.println("name() 方法返回: " + season.name());
// 使用 toString() 方法獲取枚舉常量的字符串表示
System.out.println("toString() 方法返回: " + season.toString());
}
}
在 Season 枚舉中,重寫(xiě)了 toString() 方法,讓它返回中文的季節(jié)名稱(chēng)。
- 在 main 方法里,先創(chuàng)建了一個(gè) Season 枚舉類(lèi)型的變量 season,并將其賦值為 SPRING。
- 調(diào)用 name() 方法時(shí),返回的是枚舉常量的原始名稱(chēng) SPRING。
- 調(diào)用 toString() 方法時(shí),由于重寫(xiě)了該方法,返回的是更具描述性的字符串 春季。
三、使用場(chǎng)景
在實(shí)際開(kāi)發(fā)中,重寫(xiě)枚舉的 toString() 方法通常是為了提供更具可讀性、更符合業(yè)務(wù)需求的字符串表示,以下是一些常見(jiàn)的使用場(chǎng)景:
- 增強(qiáng)用戶(hù)界面的顯示效果
當(dāng)需要將枚舉值展示給用戶(hù)時(shí),默認(rèn)的枚舉常量名稱(chēng)可能不夠友好。通過(guò)重寫(xiě) toString() 方法,可以提供更具描述性的文本,提升用戶(hù)體驗(yàn)。
示例:
enum Gender {
MALE,
FEMALE;
@Override
public String toString() {
switch (this) {
case MALE:
return "男性";
case FEMALE:
return "女性";
default:
return super.toString();
}
}
}
- 在用戶(hù)界面中顯示性別時(shí),直接使用 Gender.MALE.toString() 會(huì)顯示 “男性”,而不是 “MALE”,這對(duì)用戶(hù)來(lái)說(shuō)更直觀易懂。
- 日志記錄和調(diào)試
在日志記錄和調(diào)試過(guò)程中,更具描述性的枚舉值表示有助于快速定位問(wèn)題。重寫(xiě) toString() 方法可以讓日志信息更清晰。
示例:
enum OrderStatus {
CREATED,
PAID,
SHIPPED,
COMPLETED;
@Override
public String toString() {
switch (this) {
case CREATED:
return "訂單已創(chuàng)建";
case PAID:
return "訂單已支付";
case SHIPPED:
return "訂單已發(fā)貨";
case COMPLETED:
return "訂單已完成";
default:
return super.toString();
}
}
}
- 在記錄訂單狀態(tài)變化的日志時(shí),使用 OrderStatus.PAID.toString() 可以記錄 “訂單已支付”,這樣的日志信息更具可讀性。
- 數(shù)據(jù)序列化和反序列化
在將枚舉值序列化為字符串或從字符串反序列化時(shí),可能需要自定義的字符串表示。重寫(xiě) toString() 方法可以確保序列化和反序列化過(guò)程中使用的字符串符合業(yè)務(wù)需求。
示例:
enum PaymentMethod {
CREDIT_CARD,
PAYPAL,
ALIPAY;
@Override
public String toString() {
switch (this) {
case CREDIT_CARD:
return "信用卡支付";
case PAYPAL:
return "PayPal支付";
case ALIPAY:
return "支付寶支付";
default:
return super.toString();
}
}
}
- 在將支付方式信息存儲(chǔ)到數(shù)據(jù)庫(kù)或傳輸?shù)狡渌到y(tǒng)時(shí),使用自定義的字符串表示可以提高數(shù)據(jù)的可讀性和兼容性。
- 與外部系統(tǒng)交互
當(dāng)與外部系統(tǒng)(如第三方 API、配置文件等)進(jìn)行交互時(shí),可能需要使用特定格式的字符串來(lái)表示枚舉值。重寫(xiě) toString() 方法可以確保與外部系統(tǒng)的交互順利進(jìn)行。
示例:
enum Currency {
USD,
EUR,
CNY;
@Override
public String toString() {
switch (this) {
case USD:
return "美元";
case EUR:
return "歐元";
case CNY:
return "人民幣";
default:
return super.toString();
}
}
}
- 在與支持多種貨幣的外部支付系統(tǒng)交互時(shí),使用自定義的字符串表示可以避免因枚舉常量名稱(chēng)不一致而導(dǎo)致的問(wèn)題。
四、使用場(chǎng)景
- 本質(zhì)特性和使用場(chǎng)景有別雖然默認(rèn)情況下返回結(jié)果相同,但 name() 和 toString() 在本質(zhì)特性和使用場(chǎng)景上是有差異的:
- name() 方法:這是 Enum類(lèi)特有的方法,返回的是枚舉常量在代碼中定義的原始名稱(chēng),且這個(gè)返回值是固定不變的,不能被重寫(xiě)。它主要用于一些需要嚴(yán)格匹配枚舉常量原始名稱(chēng)的場(chǎng)景,比如反序列化操作、配置文件讀取等。
- toString() 方法:這是 Object 類(lèi)的方法,所有 Java類(lèi)都有該方法。在枚舉中,它默認(rèn)返回枚舉常量的名稱(chēng),但可以根據(jù)業(yè)務(wù)需求重寫(xiě),以提供更具描述性的信息。它常用于面向用戶(hù)的展示、日志記錄等場(chǎng)景。
- 不重寫(xiě) toString() 方法時(shí),它和 name()方法的返回結(jié)果一樣,但兩者的設(shè)計(jì)目的和使用場(chǎng)景不同。若你需要根據(jù)具體業(yè)務(wù)情況提供更友好、更具描述性的枚舉常量表示,就應(yīng)該重寫(xiě)toString() 方法。
到此這篇關(guān)于Java中枚舉的toString()和name()的使用區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Java 枚舉toString()和name()區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java大話之創(chuàng)建型設(shè)計(jì)模式教程示例
這篇文章主要為大家介紹了java大話之創(chuàng)建型設(shè)計(jì)模式教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
JavaEE多線程中阻塞隊(duì)列的項(xiàng)目實(shí)踐
本文主要介紹了JavaEE多線程中阻塞隊(duì)列的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09
一次Jvm old過(guò)高的排查過(guò)程實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次Jvm old過(guò)高的排查過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
struts2中實(shí)現(xiàn)多個(gè)文件同時(shí)上傳代碼
struts2中實(shí)現(xiàn)多個(gè)文件同時(shí)上傳代碼,需要的朋友可以參考一下2013-04-04
詳述IntelliJ IDEA 中自動(dòng)生成 serialVersionUID 的方法(圖文)
本篇文章主要介紹了詳述IntelliJ IDEA 中自動(dòng)生成 serialVersionUID 的方法(圖文),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-11-11
IDEA?Debug過(guò)程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法
在IDEA中就提供了一個(gè)幫助你回退代碼的機(jī)會(huì),但這個(gè)方法并不是萬(wàn)能的,好了,下面就來(lái)具體說(shuō)說(shuō)IDEA?Debug過(guò)程中使用Drop?Frame或Reset?Frame實(shí)現(xiàn)操作回退的方法,感興趣的朋友一起看看吧2022-04-04
SpringBoot多租戶(hù)配置與實(shí)現(xiàn)示例
本文詳細(xì)介紹了在SpringBoot中實(shí)現(xiàn)多租戶(hù)架構(gòu)的方法和步驟,包括配置數(shù)據(jù)源、Hibernate攔截器、租戶(hù)解析器等,以共享數(shù)據(jù)庫(kù)、共享數(shù)據(jù)表的方式,確保數(shù)據(jù)隔離和安全性,感興趣的可以了解一下2024-09-09
HttpClient HttpRoutePlanner接口確定請(qǐng)求目標(biāo)路由
這篇文章主要為大家介紹了使用HttpClient HttpRoutePlanner接口確定請(qǐng)求目標(biāo)路由,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

