本文目錄一覽:
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]);
}
}
enum是java關鍵字嗎?
enum是Java的關鍵字,Java的關鍵字如下:
abstract 表明類或者成員方法具有抽象屬性
assert 用來進行程序調試
boolean 基本數據類型之一,布爾類型
break 提前跳出一個塊
byte 基本數據類型之一,位元組類型
case 用在switch語句之中,表面其中的一個分支
catch 用在異常處理中,用來捕捉異常
char 基本數據類型之一,字元類型
class 類
const 保留關鍵字,沒有具體含義
continue 回到一個塊的開始處
default 默認,例如,用在switch語句中,表明一個默認的分支
do 用在do-while循環結構中
double 基本數據類型之一,雙精度浮點數類型
else 用在條件語句中,表明當條件不成立時的分支
enum 枚舉
extends 表明一個類型是另一個類型的子類型,這裡常見的類型有類和介面
final 用來說明最終屬性,表明一個類不能派生出子類,或者成員方法不能被覆蓋,或者成員域的值不能被改變
finally 用於處理異常情況,用來聲明一個基本肯定會被執行到的語句塊
float 基本數據類型之一,單精度浮點數類型
for 一種循環結構的引導詞
goto 保留關鍵字,沒有具體含義
if 條件語句的引導詞
implements 表明一個類實現了給定的介面
import 表明要訪問指定的類或包
instanceof 用來測試一個對象是否是指定類型的實例對象
int 基本數據類型之一,整數類型
interface 介面
long 基本數據類型之一,長整數類型
native 用來聲明一個方法是由與計算機相關的語言(如C/C++/FORTRAN語言)實現的
new 用來創建新實例對象
package 包
private 一種訪問控制方式:私用模式
protected 一種訪問控制方式:保護模式
public 一種訪問控制方式:共用模式
return 從成員方法中返回數據
short 基本數據類型之一,短整數類型
static 表明具有靜態屬性
strictfp 用來聲明FP_strict(單精度或雙精度浮點數)表達式遵循IEEE 754算術規範
super 表明當前對象的父類型的引用或者父類型的構造方法
switch 分支語句結構的引導詞
sychronized 表明一段代碼需要同步執行
this 指向當前實例對象的引用
throw 拋出一個異常
throws 聲明在當前定義的成員方法中所有需要拋出的異常
transient 聲明不用序列化的成員域
try 嘗試一個可能拋出異常的程序塊
void 聲明當前成員方法沒有返回值
volatile 表明兩個或者多個變數必須同步地發生變化
while 用在循環結構中
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 如何繼承?
Java Enum是不能繼承的,以下是解釋:
枚舉類使用enum定義後在編譯後默認繼承了java.lang.Enum類,而不是普通的繼承Object類。enum聲明類繼承了Serializable和Comparable兩個介面。且採用enum聲明後,該類會被編譯器加上final聲明(同String),故該類是無法繼承的。枚舉類的內部定義的枚舉值就是該類的實例(且必須在第一行定義,當類初始化時,這些枚舉值會被實例化)。
Java 5新增的enum關鍵詞,可以定義枚舉類。該類是一個特殊的類,可以定義自己的field、方法、可以實現介面,也可以定義自己的構造器。
java的enum到底有什麼用?
1.關於 Java Enum
Enum 一般用來表示一組相同類型的常量。如性別、日期、月份、顏色等。對這些屬性用常量的好處是顯而易見的,不僅可以保證單例,且比較時候可以用 」==」 來替換 equals 。是一種好的習慣。 JDK1.5 之前沒有 Enum 這個類型,那時候一般用介面常量來替代。有了 JavaEnum 之後,可以更貼近的表示這種常量。
2. 如何使用 Java Enum
簡單的用法: JavaEnum 簡單的用法一般用於代表一組常用常量,可用來代表一類相同類型的常量值。如:
//性別
public enum SexEnum {
male , female ;
}
//顏色
public enum Color {
RED , BLUE,GREEN,BLACK ;
}
枚舉對象裡面的值都必須是唯一的。
可以通過 Enum 類型名直接引用該常量,如 SexEnum.male,Color.RED.
複雜用法: Java 為枚舉類型提供了一些內置的方法,同事枚舉常量還可以有自己的方法。可以很方便的遍歷枚舉對象,看個下面的例子:
WeekDay.java
/**
* @author admin
* 2015-12-03
* 定義一個枚舉類型,代表星期一到星期日的7個縮寫常量
* 同時還定義了枚舉類型的屬性day,該屬性可以是final,也可是變數
* 同時還定義了該枚舉類型的一個方法printDay
*/
public enum WeekDay {
Mon(“Monday”), Tue(“Tuesday”), Wed(“Wednesday”), Thu(“Thursday”), Fri(
“Friday”), Sat(“Saturday”), Sun(“Sunday”);
/**定義枚舉類型自己的屬性**/
private final String day;
private WeekDay(String day) {
this.day = day;
}
/**定義枚舉類型自己的方法**/
public static void printDay(int i){
switch(i){
case 1: System.out.println(WeekDay.Mon); break;
case 2: System.out.println(WeekDay.Tue);break;
case 3: System.out.println(WeekDay.Wed);break;
case 4: System.out.println(WeekDay.Thu);break;
case 5: System.out.println(WeekDay.Fri);break;
case 6: System.out.println(WeekDay.Sat);break;
case 7: System.out.println(WeekDay.Sun);break;
default:System.out.println(“wrong number!”);
}
}
public String getDay() {
return day;
}
}
WeekDayTest.java
/**
* @author admin
* 2015-12-03
* 測試枚舉類型WeekDay.
*/
public class WeekDayTest {
public static void main(String args[]) {
for (WeekDay day : WeekDay.values()) {
System.out.println(day + “====” + day.getDay());
}
WeekDay.printDay(5);
}
}
輸出結果為:
Mon====Monday
Tue====Tuesday
Wed====Wednesday
Thu====Thursday
Fri====Friday
Sat====Saturday
Sun====Sunday
Fri
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/252157.html