本文目錄一覽:
Java中的枚舉是什麼?他的具體用法是什麼呢?
Java中的枚舉是什麼?他的具體用法是什麼呢?
枚舉就是把集合里的對象元素
一個一個提取出來!比如說
你買了一合巧克力
裡面有草莓味的
有香草口味的
有蘋果口味的
你想把他們拿出來
就必須用「手」一個一個把他們拿出來
並且一次只能取一個哦
這裡的手就是枚舉器
你取的動作就是枚舉的過程
具體的用法
這個我就不好說了
推薦
你看看JDK1.5的API和參考別人的範例
看完了
基本可以理解
枚舉幾種選擇(有迭代器和枚舉器2種)和如何判斷是否已經取完了對象元素
等等
我不是很喜歡講語法
所以不好意思我就不給你丟代碼了~
java中枚舉用來幹什麼的?
枚舉是該類型的一個實例,相當於static final 類型的變數,可用於switch中,
//枚舉類:
package com.golden.test;public enum Operation {
/**增*/
INSERT,
/**刪*/
DELETE,
/**改*/
UPDATE,
/**查*/
QUERY
}
//測試類
package com.golden.test;
public class TestEnum {
public static void main(String[] args) {
System.out.println(Operation.DELETE);
System.out.println(Operation.valueOf(“DELETE”));
System.out.println(Operation.valueOf(“DELETE”)==Operation.DELETE);
System.out.println(“DELETE”.equals(Operation.DELETE.toString()));
switch (Operation.DELETE) {
case INSERT: /**TODO*/break;
case DELETE: /**TODO*/System.out.println(“DELETE…”);break;
case UPDATE:/**TODO*/break;
case QUERY: /**TODO*/break;
default:
break;
}
}
}
enum在java中是什麼意思
Enum 類型的介紹
枚舉類型(Enumerated Type) 很早就出現在編程語言中,它被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變數提供更大的取值範圍。
舉個例子來說明一下,如果希望為彩虹描繪出七種顏色,你可以在 Java 程序中通過常量定義方式來實現。
清單 1. 常量定義
Public static class RainbowColor {
// 紅橙黃綠青藍紫七種顏色的常量定義
public static final int RED = 0;
public static final int ORANGE = 1;
public static final int YELLOW = 2;
public static final int GREEN = 3;
public static final int CYAN = 4;
public static final int BLUE = 5;
public static final int PURPLE = 6;
}
使用的時候,你可以在程序中直接引用這些常量。但是,這種方式還是存在著一些問題。
類型不安全
由於顏色常量的對應值是整數形,所以程序執行過程中很有可能給顏色變數傳入一個任意的整數值,導致出現錯誤。
沒有命名空間
由於顏色常量只是類的屬性,當你使用的時候不得不通過類來訪問。
一致性差
因為整形枚舉屬於編譯期常量,所以編譯過程完成後,所有客戶端和伺服器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或者增加新的枚舉值後,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現錯誤。
類型無指意性
由於顏色枚舉值僅僅是一些無任何含義的整數值,如果在運行期調試時候,你就會發現日誌中有很多魔術數字,但除了程序員本身,其他人很難明白其奧秘。
如何定義 Enum 類型
為了改進 Java 語言在這方面的不足彌補缺陷,5.0 版本 SDK 發布時候,在語言層面上增加了枚舉類型。枚舉類型的定義也非常的簡單,用 enum 關鍵字加上名稱和大括弧包含起來的枚舉值體即可,例如上面提到的彩虹顏色就可以用新的 enum 方式來重新定義:
enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }
從上面的定義形式來看,似乎 Java 中的枚舉類型很簡單,但實際上 Java 語言規範賦予枚舉類型的功能非常的強大,它不僅是簡單地將整形數值轉換成對象,而是將枚舉類型定義轉變成一個完整功能的類定義。這種類型定義的擴展允許開發者給枚舉類型增加任何方法和屬性,也可以實現任意的介面。另外,Java 平台也為 Enum 類型提供了高質量的實現,比如默認實現 Comparable 和 Serializable 介面,讓開發者一般情況下不用關心這些細節。
回到本文的主題上來,引入枚舉類型到底能夠給我們開發帶來什麼樣好處呢?一個最直接的益處就是擴大 switch 語句使用範圍。5.0 之前,Java 中 switch 的值只能夠是簡單類型,比如 int、byte、short、char, 有了枚舉類型之後,就可以使用對象了。這樣一來,程序的控制選擇就變得更加的方便,看下面的例子:
清單 2. 定義 Enum 類型
// 定義一周七天的枚舉類型
public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
// 讀取當天的信息
WeekDayEnum today = readToday();
// 根據日期來選擇進行活動
switch(today) {
Mon: do something; break;
Tue: do something; break;
Wed: do something; break;
Thu: do something; break;
Fri: do something; break;
Sat: play sports game; break;
Sun: have a rest; break;
}
對於這些枚舉的日期,JVM 都會在運行期構造成出一個簡單的對象實例一一對應。這些對象都有唯一的 identity,類似整形數值一樣,switch 語句就根據此來進行執行跳轉。
如何定製 Enum 類型
除了以上這種最常見的枚舉定義形式外,如果需要給枚舉類型增加一些複雜功能,也可以通過類似 class 的定義來給枚舉進行定製。比如要給 enum 類型增加屬性,可以像下面這樣定義:
清單 3. 定製枚舉類型
// 定義 RSS(Really Simple Syndication) 種子的枚舉類型
public enum NewsRSSFeedEnum {
// 雅虎頭條新聞 RSS 種子
YAHOO_TOP_STORIES(“”),
//CBS 頭條新聞 RSS 種子
CBS_TOP_STORIES(“”),
// 洛杉磯時報頭條新聞 RSS 種子
LATIMES_TOP_STORIES(“”);
// 枚舉對象的 RSS 地址的屬性
private String rss_url;
// 枚舉對象構造函數
private NewsRSSFeedEnum(String rss) {
this.rss_url = rss;
}
// 枚舉對象獲取 RSS 地址的方法
public String getRssURL() {
return this.rss_url;
}
}
上面頭條新聞的枚舉類型增加了一個 RSS 地址的屬性 , 記錄頭條新聞的訪問地址。同時,需要外部傳入 RSS 訪問地址的值,因而需要定義一個構造函數來初始化此屬性。另外,還需要向外提供方法來讀取 RSS 地址。
如何避免錯誤使用 Enum
不過在使用 Enum 時候有幾個地方需要注意:
enum 類型不支持 public 和 protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。
定義 enum 類型時候,如果是簡單類型,那麼最後一個枚舉值後不用跟任何一個符號;但如果有定製方法,那麼最後一個枚舉值與後面代碼要用分號’;’隔開,不能用逗號或空格。
由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( 『 == 』 ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
看下面的這個例子:
清單 4. 避免錯誤使用 Enum 示例
// 定義一個一周七天的枚舉類型
package example.enumeration.codes;
public enum WeekDayEnum {
Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7);
private int index;
WeekDayEnum(int idx) {
this.index = idx;
}
public int getIndex() {
return index;
}
}
// 客戶端程序,將一個枚舉值通過網路傳遞給伺服器端
package example.enumeration.codes;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class EnumerationClient {
public static void main(String… args) throws UnknownHostException, IOException {
Socket socket = new Socket();
// 建立到伺服器端的連接
socket.connect(new InetSocketAddress(“127.0.0.1”, 8999));
// 從連接中得到輸出流
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
// 將星期五這個枚舉值傳遞給伺服器端
oos.writeObject(WeekDayEnum.Fri);
oos.close();
os.close();
socket.close();
}
}
// 伺服器端程序,將從客戶端收到的枚舉值應用到邏輯處理中
package example.enumeration.codes;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class EnumerationServer {
public static void main(String… args) throws IOException, ClassNotFoundException {
ServerSocket server = new ServerSocket(8999);
// 建立伺服器端的網路連接偵聽
Socket socket = server.accept();
// 從連接中獲取輸入流
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
// 讀出客戶端傳遞來的枚舉值
WeekDayEnum day = (WeekDayEnum) ois.readObject();
// 用值比較方式來對比枚舉對象
if (day == WeekDayEnum.Fri) {
System.out.println(“client Friday enum value is same as server’s”);
} else if (day.equals(WeekDayEnum.Fri)) {
System.out.println(“client Friday enum value is equal to server’s”);
} else {
System.out.println(“client Friday enum value is not same as server’s”);
}
// 用 switch 方式來比較枚舉對象
switch (day) {
case Mon:
System.out.println(“Do Monday work”);
break;
case Tue:
System.out.println(“Do Tuesday work”);
break;
case Wed:
System.out.println(“Do Wednesday work”);
break;
case Thu:
System.out.println(“Do Thursday work”);
break;
case Fri:
System.out.println(“Do Friday work”);
break;
case Sat:
System.out.println(“Do Saturday work”);
break;
case Sun:
System.out.println(“Do Sunday work”);
break;
default:
System.out.println(“I don’t know which is day”);
break;
}
ois.close();
is.close();
socket.close();
}
}
列印結果如下:
client Friday enum value is same as server’s
Do Friday work
通過程序執行結果,我們能夠發現在分散式條件下客戶端和服務端的虛擬機上都生成了一個枚舉對象,即使看起來一樣的 Fri 枚舉值,如果使用等號『 == 』進行比較的話會出現不等的情況。而 switch 語句則是通過 equal 方法來比較枚舉對象的值,因此當你的枚舉對象較複雜時候,你就需要小心 override 與比較相關的方法,防止出現值比較方面的錯誤。
Enum 相關工具類
JDK5.0 中在增加 Enum 類的同時,也增加了兩個工具類 EnumSet 和 EnumMap,這兩個類都放在 java.util 包中。EnumSet 是一個針對枚舉類型的高性能的 Set 介面實現。EnumSet 中裝入的所有枚舉對象都必須是同一種類型,在其內部,是通過 bit-vector 來實現,也就是通過一個 long 型數。EnumSet 支持在枚舉類型的所有值的某個範圍中進行迭代。回到上面日期枚舉的例子上:
enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
你能夠在每周七天日期中進行迭代,EnumSet 類提供一個靜態方法 range 讓迭代很容易完成:
for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) {
System.out.println(day);
}
列印結果如下:
Mon
Tue
Wed
Thu
Fri
EnumSet 還提供了很多個類型安全的獲取子集的 of 方法,使你很容易取得子集:
EnumSetWeekDayEnum subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed);
for (WeekDayEnum day : subset) {
System.out.println(day);
}
列印結果如下:
Mon
Wed
與 EnumSet 類似,EnumMap 也是一個高性能的 Map 介面實現,用來管理使用枚舉類型作為 keys 的映射表,內部是通過數組方式來實現。EnumMap 將豐富的和安全的 Map 介面與數組快速訪問結合到一起,如果你希望要將一個枚舉類型映射到一個值,你應該使用 EnumMap。看下面的例子:
清單 5. EnumMap 示例
// 定義一個 EnumMap 對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型
private static MapWeekDayEnum, RainbowColor schema =
new EnumMapWeekDayEnum, RainbowColor(WeekDayEnum.class);
static{
// 將一周的每一天與彩虹的某一種色彩映射起來
for (int i = 0; i WeekDayEnum.values().length; i++) {
schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]);
}
}
System.out.println(“What is the lucky color today?”);
System.out.println(“It’s ” + schema.get(WeekDayEnum.Sat));
當你詢問周六的幸運色彩時候,會得到藍色:
清單 6. 運行結果
What is the lucky color today?
It’s BLUE
結束語
Enum 類型提出給 JAVA 編程帶了了極大的便利,讓程序的控制更加的容易,也不容易出現錯誤。所以在遇到需要控制程序流程時候,可以多想想是否可以利用 enum 來實現。
java中的enum有什麼用呢?
enum也就是枚舉,像一個集合,只不過集合裡面的內容都固定了.
public enum Season3 {
SPRING(“春天”),
SUMMER(“夏天”),
AUTUMN(“秋天”),
WINTER(“冬天”);
private String name;
private Season3(String name){
this.name = name;
}
public double getAvgTemp(){
switch(this){
case SPRING:return 10.2;
case SUMMER:return 25.8;
case AUTUMN:return 19.6;
case WINTER:return -3.6;
}
return 0.0;
}
public String getName(){
return name;
}
}
public class Test {
public static void main(String[] args) {
m3(Season3.SPRING);
}
public static void m3(Season3 season){
System.out.println(season.getName()+”:”+season.getAvgTemp());
Season3[] allSeason = Season3.values();//返回枚舉類中所有枚舉值的一個數組
System.out.println(allSeason[0]);
}
}
java中的enum有什麼用?
這是枚舉類型,對於某些數據,例如月份,只有有限的數據,沒必要單獨列一個類,這時候就可以用枚舉了!
這是枚舉的幾種用法
原創文章,作者:MFAO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134414.html