在本教程中,我們將學(xué)習(xí)Java中的枚舉。我們將在示例的幫助下學(xué)習(xí)創(chuàng)建和使用枚舉和枚舉類。
在Java中,枚舉是一種具有固定的可能值集的類型。我們使用enum關(guān)鍵字來(lái)聲明枚舉。例如,
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
在這里,我們創(chuàng)建了一個(gè)名為Size的枚舉。
花括號(hào)內(nèi)的值稱為枚舉值(常量)。這些是枚舉類型可以保留的唯一值。
注意:枚舉常量通常以大寫(xiě)形式表示。
讓我們舉一個(gè)簡(jiǎn)單的實(shí)例。
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } class Main { public static void main(String[] args) { System.out.println(Size.SMALL); System.out.println(Size.MEDIUM); } }
輸出結(jié)果
SMALL MEDIUM
從上面的示例可以看出,我們使用枚舉名稱訪問(wèn)常量值。
同樣,我們可以創(chuàng)建枚舉類型的變量。例如,
Size pizzaSize;
在這里,pizzaSize是Size類型的變量。它只能分配4個(gè)值。
pizzaSize = Size.SMALL; pizzaSize = Size.MEDIUM; pizzaSize = Size.LARGE; pizzaSize = Size.EXTRALARGE;
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE } class Test { Size pizzaSize; public Test(Size pizzaSize) { this.pizzaSize = pizzaSize; } public void orderPizza() { switch(pizzaSize) { case SMALL: System.out.println("我點(diǎn)了一個(gè)小號(hào)比薩餅。"); break; case MEDIUM: System.out.println("我點(diǎn)了一個(gè)中號(hào)的披薩。"); break; default: System.out.println("我不知道該點(diǎn)哪一種。"); break; } } } class Main { public static void main(String[] args) { Test t1 = new Test(Size.MEDIUM); t1.orderPizza(); } }
輸出結(jié)果
我點(diǎn)了一個(gè)中號(hào)的披薩。
在上面的程序中,我們創(chuàng)建了一個(gè)枚舉類型Size。然后,我們聲明Size類型的變量pizzaSize。
變量pizzaSize只能分配4個(gè)值(SMALL,MEDIUM,LARGE,EXTRALARGE)。
變量pizzaSize分配了MEDIUM常數(shù)。 基于此,將打印switch case語(yǔ)句的一種情況。
在Java中,枚舉類型被認(rèn)為是類的一種特殊類型。它是在Java 5發(fā)行版中引入的。
枚舉類可以像常規(guī)類一樣包含方法和字段。
enum Size { constant1, constant2, …, constantN; //方法和字段 }
枚舉常量始終默認(rèn)為public static final。
當(dāng)創(chuàng)建enum類時(shí),編譯器還將創(chuàng)建每個(gè)enum常量的實(shí)例(對(duì)象)。
enum Size{ SMALL, MEDIUM, LARGE, EXTRALARGE; public String getSize() { //這將引用對(duì)象SMALL switch(this) { case SMALL: return "small"; case MEDIUM: return "medium"; case LARGE: return "large"; case EXTRALARGE: return "extra large"; default: return null; } } public static void main(String[] args) { //使用對(duì)象SMALL調(diào)用方法getSize() System.out.println("披薩的大小是 " + Size.SMALL.getSize()); } }
輸出結(jié)果
披薩的大小是 small
在上面的示例中,我們創(chuàng)建了一個(gè)枚舉類 Size。它有四個(gè)常數(shù) SMALL,MEDIUM,LARGE和EXTRALARGE。
由于Size是枚舉類,因此編譯器會(huì)自動(dòng)為每個(gè)枚舉常量創(chuàng)建實(shí)例。
在main()方法內(nèi)部,我們已使用實(shí)例SMALL調(diào)用getSize()方法。
像常規(guī)類一樣,枚舉類也可以包含構(gòu)造函數(shù)。要了解更多信息,請(qǐng)?jiān)L問(wèn)Java枚舉構(gòu)造函數(shù)。
枚舉類中有一些預(yù)定義的方法可以隨時(shí)使用。
ordinal()方法返回枚舉常量的位置。例如,
ordinal(SMALL) //返回 0
compareTo()方法根據(jù)序數(shù)值比較枚舉常量。例如,
Size.SMALL.compareTo(Size.MEDIUM) //返回 ordinal(SMALL) - ordinal(MEDIUM)
toString()方法返回枚舉常量的字符串表示形式。例如,
SMALL.toString() //返回 "SMALL"
name()方法以字符串形式返回枚舉常量的定義名稱。name()方法返回的值為final。例如,
name(SMALL) //返回 "SMALL"
valueOf()方法采用字符串,并返回具有相同字符串名稱的枚舉常量。例如,
Size.valueOf("SMALL") //返回常量 SMALL
values()方法返回包含所有枚舉常量的枚舉類型數(shù)組。例如,
Size[] enumArray = Size.value();
在Java中,引入了enum來(lái)代替int常量的使用。
假設(shè)我們使用了int常量集合。
class Size { public final static int SMALL = 1; public final static int MEDIUM = 2; public final static int LARGE = 3; public final static int EXTRALARGE = 4; }
這里,如果我們打印常量,問(wèn)題就出現(xiàn)了。這是因?yàn)橹淮蛴?shù)字,這可能沒(méi)有幫助。
因此,我們可以簡(jiǎn)單地使用枚舉,代替使用int常量。例如,
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
這使我們的代碼更加直觀。
同樣,枚舉提供了編譯時(shí)類型的安全性。
如果我們聲明Size類型的變量(如上述示例中所示),則可以確保該變量將容納四個(gè)值之一。如果我們嘗試傳遞這四個(gè)值以外的值,則編譯器將拋出錯(cuò)誤。