您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java枚舉類有哪些使用場(chǎng)景”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java枚舉類有哪些使用場(chǎng)景”吧!
Java的特點(diǎn)有哪些 1.Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。
為什么要用枚舉類
什么場(chǎng)景會(huì)用到枚舉,比如在表示一周的某一天,一年中的四季,這樣一組常量的時(shí)候我們會(huì)用到枚舉。在Java引入枚舉類之前常用一組int常量來(lái)表示枚舉,這種方式稱為int枚舉模式(int enum pattern)。
private static final int MONDAY = 1;
private static final int TUESDAY = 2;
private static final int WEDNESDAY = 3;
private static final int THURSDAY = 4;private static final int CODE_START = 1;
private static final int CODE_STATUS = 2;
private static final int CODE_STOP = 3;
這種我們非常習(xí)慣的模式其實(shí)存在著很多不足和問(wèn)題,
int枚舉組不具備命名空間的能力,當(dāng)表示具有相同命名常量時(shí),需要添加前綴避免沖突
int表示的枚舉值不具有描述性,需要遍歷判斷具體的值并添加描述
int枚舉模式不具有安全性,此外int類型是編譯時(shí)常量,如果與int枚舉常量關(guān)聯(lián)的值發(fā)生變化,必須重新編譯,不重新編譯雖然不影響運(yùn)行,但是準(zhǔn)確性已經(jīng)不能保證
即便是升級(jí)為用String來(lái)表示枚舉值,String枚舉模式(String enum pattern),但這樣同樣存在其他問(wèn)題,
初學(xué)者容易直接把字符串常量硬編碼到代碼中,不使用對(duì)應(yīng)的常量字段(filed)名,一旦書(shū)寫錯(cuò)誤,編譯器無(wú)法檢查,但在運(yùn)行時(shí)會(huì)報(bào)出異常
String枚舉模式會(huì)存在一定的性能問(wèn)題,涉及到字符串的比較操作
因此Java引入了枚舉類型解決int和String枚舉模式帶來(lái)的諸多不足,枚舉類型保證了編譯時(shí)的類型安全,枚舉類型有自己獨(dú)立的命名空間,枚舉類型便于擴(kuò)展,可以添加方法和域?qū)崿F(xiàn)其他的外部接口。
如何使用枚舉類
創(chuàng)建枚舉類
Java中枚舉是一種特殊的引用類型,是類(Class)的一種,JDK1.5中開(kāi)始引入枚舉類型,在Java中使用enum關(guān)鍵字來(lái)聲明枚舉類,枚舉類編譯后默認(rèn)繼承了java.lang.Enum,因此枚舉類不能在繼承其他類,枚舉一般用來(lái)聲明某一特定類型的有窮集合,如用枚舉表示四季
public enum Season { SPRING,SUMMER,FALL,WINTER }
枚舉類API
參考JDK api 1.8.CHM,可以看到枚舉類的常用api如下:
name public final String name()
返回此枚舉常量的名稱,與其枚舉聲明中聲明的完全相同。 大多數(shù)程序員應(yīng)該使用toString()方法,因?yàn)閠oString方法可能會(huì)返回一個(gè)更加用戶友好的名稱。 該方法主要用于專門的情況,其中正確性取決于獲得確切的名稱,這從發(fā)布到發(fā)布不會(huì)有所不同。
ordinal public final int ordinal()
返回此枚舉常數(shù)的序數(shù)(其枚舉聲明中的位置,其中初始常數(shù)的序數(shù)為零)。 大多數(shù)程序員將不會(huì)使用這種方法。 它被設(shè)計(jì)為使用復(fù)雜的基于枚舉的數(shù)據(jù)結(jié)構(gòu),如EnumSet和EnumMap 。
toString public String toString()
返回聲明中包含的此枚舉常量的名稱。 該方法可以被覆蓋,盡管它通常不是必需或不可取的。 當(dāng)一個(gè)更“程序員友好”的字符串形式存在時(shí),枚舉類型應(yīng)該覆蓋此方法。
重寫: toString 在 Object
compareTo public final int compareTo(E o)
將此枚舉與指定的對(duì)象進(jìn)行比較以進(jìn)行訂購(gòu)。 返回一個(gè)負(fù)整數(shù),零或正整數(shù),因?yàn)樵搶?duì)象小于,等于或大于指定對(duì)象。 枚舉常數(shù)僅與相同枚舉類型的其他枚舉常量相當(dāng)。 該方法實(shí)現(xiàn)的自然順序是聲明常量的順序。
Specified by: compareTo 在界面Comparable<E extends Enum<E>
參數(shù) :o - 要比較的對(duì)象。
結(jié)果 :負(fù)整數(shù),零或正整數(shù),因?yàn)樵搶?duì)象小于,等于或大于指定對(duì)象。
getDeclaringClass public final Class<E> getDeclaringClass()
返回與此枚舉常量的枚舉類型相對(duì)應(yīng)的Class對(duì)象。 當(dāng)且僅當(dāng)e1.getDeclaringClass()== e2.getDeclaringClass())時(shí),兩個(gè)枚舉常量e1和e2具有相同的枚舉類型。 (此方法返回的值可能與使用常量特定類體的枚舉常數(shù)Object.getClass()方法返回的值不同)
結(jié)果:該類對(duì)象對(duì)應(yīng)于此枚舉常量的枚舉類型
valueOf public static <T extends Enum<T>> T valueOf(Class <T> enumType,String name)
返回具有指定名稱的指定枚舉類型的枚舉常量。 該名稱必須與用于聲明此類型的枚舉常量的標(biāo)識(shí)符完全一致。 (不允許使用外來(lái)空白字符。)
請(qǐng)注意,對(duì)于特定枚舉類型T ,可以使用該枚舉上隱式聲明的public static T valueOf(String)方法,而不是使用此方法將名稱映射到
相應(yīng)的枚舉常量。 枚舉類型的所有常量可以通過(guò)調(diào)用該類型的隱式public static T[] values()方法來(lái)獲得。
values
此方法并未在API中提供,返回枚舉類型所有對(duì)象實(shí)例,返回值枚舉類型的數(shù)組。
枚舉應(yīng)用案例
上面簡(jiǎn)單描述了如何聲明一個(gè)枚舉類,這里結(jié)合實(shí)際應(yīng)用場(chǎng)景描述枚舉的其他用法
單例設(shè)計(jì)模式
說(shuō)到單例模式很多人會(huì)比較熟悉懶漢、餓漢等常見(jiàn)的單例書(shū)寫模式,用枚舉表示枚舉還是比較少見(jiàn)的,對(duì)于單例設(shè)計(jì)模式的多種寫法,單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法。首先回顧下單例設(shè)計(jì)模式要求滿足的特點(diǎn):
構(gòu)造方法私有化;
實(shí)例化的變量引用私有化;
獲取實(shí)例的方法共有。
public enum Singleton { INSTANCE; public Singleton getInstance(){ return INSTANCE; } }
使用枚舉方式創(chuàng)建單例的好處:
避免反射攻擊
避免序列化問(wèn)題
有窮對(duì)象集合
枚舉類型中的構(gòu)造器默認(rèn)私有化,只能添加private修飾或者不添加
枚舉類型中定義的抽象方法必須被所有常量中的具體方法所覆蓋,特定于常量的方法實(shí)現(xiàn)可以結(jié)合特定于常量的數(shù)據(jù)結(jié)合起來(lái)
用枚舉表示加減乘除的操作
public enum Operation { PLUS("+","加法"){ public double apply(double x,double y){ return x + y; } }, MINUS("-","減法"){ public double apply(double x,double y){ return x - y; } }, TIMES("*","乘法"){ public double apply(double x,double y){ return x * y; } }, DIVIDE("/","除法"){ public double apply(double x,double y){ return x / y; } }; private final String symbol; private final String operName; public String getSymbol() { return symbol; } public String getOperName() { return operName; } Operation(String symbol, String operName){ this.symbol = symbol; this.operName = operName; } public abstract double apply(double x,double y); }
調(diào)用枚舉中的方法
public class TestOpera { public static void main(String[] args) { double x = 1; double y = 1; for(Operation operate : Operation.values()){ System.out.println( operate.getOperName()+":"+x+operate.getSymbol()+y+" = "+operate.apply(x,y) ); } } }
輸出結(jié)果
加法:1.0 + 1.0 = 2.0
減法:1.0 - 1.0 = 0.0
乘法:1.0 * 1.0 = 1.0
除法:1.0 / 1.0 = 1.0
引入枚舉類型,不僅可以描述枚舉本身,還可以添加描述性字符串,甚至給每個(gè)對(duì)象添加結(jié)合特有常量的行為,也不用考慮其他安全性為題。
到此,相信大家對(duì)“Java枚舉類有哪些使用場(chǎng)景”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。