當前位置:首頁 » 編程語言 » javaenumofenum

javaenumofenum

發布時間: 2024-11-26 13:20:09

A. java的enum到底有什麼用

1.關於 Java Enum

Enum 一般用來表示一組相同類型的常量。如性別、日期、月份、顏色等。對這些屬性用常量的好處是顯而易見的,不僅可以保證單例,且比較時候可以用 」==」 來替換 equals 。是一種好的習慣。 JDK1.5 之前沒有 Enum 這個類型,那時候一般用介面常量來替代。有了 JavaEnum 之後,可以更貼近的表示這種常量。

2.如何使用 Java Enum

簡單的用法: JavaEnum 簡單的用法一般用於代表一組常用常量,可用來代表一類相同類型的常量值。如:

//性別
publicenumSexEnum{
male,female;
}
//顏色
publicenumColor{
RED,BLUE,GREEN,BLACK;
}

枚舉對象裡面的值都必須是唯一的。

可以通過 Enum 類型名直接引用該常量,如 SexEnum.male,Color.RED.

復雜用法: Java 為枚舉類型提供了一些內置的方法,同事枚舉常量還可以有自己的方法。可以很方便的遍歷枚舉對象,看個下面的例子:

WeekDay.java

/**
*@authoradmin
*2015-12-03
*定義一個枚舉類型,代表星期一到星期日的7個縮寫常量
*同時還定義了枚舉類型的屬性day,該屬性可以是final,也可是變數
*同時還定義了該枚舉類型的一個方法printDay
*/
publicenumWeekDay{
Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri(
"Friday"),Sat("Saturday"),Sun("Sunday");

/**定義枚舉類型自己的屬性**/
privatefinalStringday;

privateWeekDay(Stringday){
this.day=day;
}

/**定義枚舉類型自己的方法**/
publicstaticvoidprintDay(inti){
switch(i){
case1:System.out.println(WeekDay.Mon);break;
case2:System.out.println(WeekDay.Tue);break;
case3:System.out.println(WeekDay.Wed);break;
case4:System.out.println(WeekDay.Thu);break;
case5:System.out.println(WeekDay.Fri);break;
case6:System.out.println(WeekDay.Sat);break;
case7:System.out.println(WeekDay.Sun);break;
default:System.out.println("wrongnumber!");
}
}

publicStringgetDay(){
returnday;
}
}

WeekDayTest.java

/**
*@authoradmin
*2015-12-03
*測試枚舉類型WeekDay.
*/
publicclassWeekDayTest{
publicstaticvoidmain(Stringargs[]){
for(WeekDayday: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

B. java枚舉類中為什麼不可以有整型,下面會報錯

枚舉也是一種類,不能像你代碼中那樣把它理解成一個數組,
一個類該怎麼寫枚舉類也該咋寫。
「1,2,3」是一種數據類型,它不是對象也不是變數,肯定報錯。

下面是從網上摘的一個說明,你看下

枚舉(enum):
1.Java 5 新增,是類類型,但不能使用new
不能繼承其他類,也不能作為超類,即不能擴展.但隱式繼承自java.lang.Enum類,可以實現介面.
2.枚舉包括兩個預定義方法:
public static enum-type[] values();
public static enum-type valueOf(String st); 用於for-each循環遍歷枚舉常量.
且可以用」==」來判斷兩個枚舉常量是否相等.
從Enum繼承而來三個方法:
final int ordinal() ----返回常量順序值
final int compareTo(enum-Type e) -----同一枚舉中比較順序值
final Boolean equals(enum-type e) -----同一枚舉中是否相等,相當於」==」
3.在switch表達示中case語句不需也不能加入枚舉的類型,否則會出錯.
4.枚舉是類類型,可以定義構造函數,且可以重載,同樣也可定義其他的實例方法和變數,這些每一個枚舉常量都有自己的一個副本.甚至可以定義靜態的成員.可以實現介面.
如:public enum Answer implements DoAnswer{
Perfect(10),Good(8),Common(5),Bad(2),Terrible;//枚舉常量,相當於public static Answer類型
public static int type=1; //定義一個靜態成員
private int degree; //定義一個實例成員變數
private Answer(){ //定義一個不帶參數的構造函數,注只能為private的,默認也一樣
degree=-1;
}
private Answer(int d){ //定義一個帶參數的重載構造函數
degree=d;
}
public String getProblem(){ //實現介面方法
return DoAnswer.PROBLEM;
}
public int getDegree(){ //定義一個實例成員函數
return degree;
}
public Answer getAnswer(){ //定義一個返回自身的成員函數,每一個常量都有自己的副本
return this;
}
}

C. java枚舉類型

java 枚舉類型enum 的使用
最近跟同事討論問題的時候,突然同事提到我們為什麼java 中定義的常量值不採用enmu 枚舉類型,而採用public final static 類型來定義呢?以前我們都是採用這種方式定義的,很少採用enum 定義,所以也都沒有注意過,面對突入起來的問題,還真有點不太清楚為什麼有這樣的定義。既然不明白就抽時間研究下吧。
Java 中的枚舉類型採用關鍵字enum 來定義,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum 類型。要了解枚舉類型,建議大家先打開jdk 中的Enum類簡單讀一下,這個類裡面定義了很多protected 方法,比如構造函數,如果要使用這些方法我們可以把枚舉類型定義到當前類中。每個枚舉類型,都有自己的名字和順序,當我們輸出一個枚舉類型的時候,會輸入枚舉類型的name ,具體可以參考下面的例子。
一、 通常定義常量方法
我們通常利用public final static 方法定義的代碼如下,分別用1 表示紅燈,3 表示綠燈,2 表示黃燈。

package com.csdn.myEnum;
public class Light {
/* 紅燈 */
public final static int RED =1;
/* 綠燈 */
public final static int GREEN =3;
/* 黃燈 */
public final static int YELLOW =2;
}

二、 枚舉類型定義常量方法
枚舉類型的簡單定義方法如下,我們似乎沒辦法定義每個枚舉類型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:

public enum Light {
RED , GREEN , YELLOW ;
}

我們只能夠表示出紅燈、綠燈和黃燈,但是具體的值我們沒辦法表示出來。別急,既然枚舉類型提供了構造函數,我們可以通過構造函數和覆寫toString方法來實現。首先給Light 枚舉類型增加構造方法,然後每個枚舉類型的值通過構造函數傳入對應的參數,同時覆寫toString 方法,在該方法中返回從構造函數中傳入的參數,改造後的代碼如下:

public enum Light {
// 利用構造函數傳參
RED (1), GREEN (3), YELLOW (2);

// 定義私有變數
private int nCode ;

// 構造函數,枚舉類型只能為私有
private Light( int _nCode) {
this . nCode = _nCode;
}

@Override
public String toString() {
return String.valueOf ( this . nCode );
}
}

三、 完整示例代碼
枚舉類型的完整演示代碼如下:

package com.csdn.myEnum;

import java.util.EnumMap;
import java.util.EnumSet;

public class LightTest {

// 1. 定義枚舉類型
public enum Light {
// 利用構造函數傳參
RED (1), GREEN (3), YELLOW (2);

// 定義私有變數
private int nCode ;

// 構造函數,枚舉類型只能為私有
private Light( int _nCode) {
this . nCode = _nCode;
}

@Override
public String toString() {
return String.valueOf ( this . nCode );
}
}

/**
* @param args
*/
public static void main(String[] args ) {

// 1. 遍歷枚舉類型
System. out .println( " 演示枚舉類型的遍歷 ......" );
testTraversalEnum ();

// 2. 演示 EnumMap 對象的使用
System. out .println( " 演示 EnmuMap 對象的使用和遍歷 ....." );
testEnumMap ();

// 3. 演示 EnmuSet 的使用
System. out .println( " 演示 EnmuSet 對象的使用和遍歷 ....." );
testEnumSet ();
}

/**
* 演示枚舉類型的遍歷
*/
private static void testTraversalEnum() {
Light[] allLight = Light.values ();
for (Light aLight : allLight) {
System. out .println( " 當前燈 name : " + aLight.name());
System. out .println( " 當前燈 ordinal : " + aLight.ordinal());
System. out .println( " 當前燈: " + aLight);
}
}

/**
* 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不過 key 要是枚舉類型
*/
private static void testEnumMap() {
// 1. 演示定義 EnumMap 對象, EnumMap 對象的構造函數需要參數傳入 , 默認是key 的類的類型
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
Light. class );
currEnumMap.put(Light. RED , " 紅燈 " );
currEnumMap.put(Light. GREEN , " 綠燈 " );
currEnumMap.put(Light. YELLOW , " 黃燈 " );

// 2. 遍歷對象
for (Light aLight : Light.values ()) {
System. out .println( "[key=" + aLight.name() + ",value="
+ currEnumMap.get(aLight) + "]" );
}
}

/**
* 演示 EnumSet 如何使用, EnumSet 是一個抽象類,獲取一個類型的枚舉類型內容<BR/>
* 可以使用 allOf 方法
*/
private static void testEnumSet() {
EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
for (Light aLightSetElement : currEnumSet) {
System. out .println( " 當前 EnumSet 中數據為: " + aLightSetElement);
}

}
}

執行結果如下:

演示枚舉類型的遍歷 ......
當前燈 name : RED
當前燈 ordinal : 0
當前燈: 1
當前燈 name : GREEN
當前燈 ordinal : 1
當前燈: 3
當前燈 name : YELLOW
當前燈 ordinal : 2
當前燈: 2
演示 EnmuMap 對象的使用和遍歷 .....
[key=RED,value= 紅燈 ]
[key=GREEN,value= 綠燈 ]
[key=YELLOW,value= 黃燈 ]
演示 EnmuSet 對象的使用和遍歷 .....
當前 EnumSet 中數據為: 1
當前 EnumSet 中數據為: 3
當前 EnumSet 中數據為: 2

四、 通常定義常量方法和枚舉定義常量方法區別
以下內容可能有些無聊,但絕對值得一窺
1. 代碼:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}

有什麼不好了,大家都這樣用了很長時間了,沒什麼問題啊。
首先,它不是類型安全的。你必須確保是int
其次,你還要確保它的范圍是0 和1
最後,很多時候你列印出來的時候,你只看到 1 和0 ,

但其沒有看到代碼的人並不知道你的企圖,拋棄你所有舊的public static final 常量
2. 可以創建一個enum 類,把它看做一個普通的類。除了它不能繼承其他類了。(java 是單繼承,它已經繼承了Enum),
可以添加其他方法,覆蓋它本身的方法
3. switch() 參數可以使用enum 了
4. values() 方法是編譯器插入到enum 定義中的static 方法,所以,當你將enum 實例向上轉型為父類Enum 是,values() 就不可訪問了。解決辦法:在Class中有一個getEnumConstants() 方法,所以即便Enum 介面中沒有values() 方法,我們仍然可以通過Class 對象取得所有的enum 實例
5. 無法從enum 繼承子類,如果需要擴展enum 中的元素,在一個介面的內部,創建實現該介面的枚舉,以此將元素進行分組。達到將枚舉元素進行分組。
6. 使用EnumSet 代替標志。enum 要求其成員都是唯一的,但是enum 中不能刪除添加元素。
7. EnumMap 的key 是enum ,value 是任何其他Object 對象。
8. enum 允許程序員為eunm 實例編寫方法。所以可以為每個enum 實例賦予各自不同的行為。
9. 使用enum 的職責鏈(Chain of Responsibility) . 這個關繫到設計模式的職責鏈模式。以多種不同的方法來解決一個問題。然後將他們鏈接在一起。當一個請求到來時,遍歷這個鏈,直到鏈中的某個解決方案能夠處理該請求。
10. 使用enum 的狀態機
11. 使用enum 多路分發

D. 詳解Java枚舉類型(Enum)中的方法

在深入解析Java枚舉類型(Enum)的過程中,我們探討了其內部機制和方法。首先,編譯後,枚舉類會轉化為繼承自java.lang.Enum的類,每個枚舉值在類初始化時即被實例化。Java枚舉類中存在一些由編譯器生成的特殊方法,以及繼承自Enum抽象類的方法,這些方法可用於枚舉值的操作。

例如,創建一個簡單的枚舉類,我們可以看到每個枚舉值都支持Enum抽象類的方法。此外,盡管枚舉值由編譯器創建,但其構造函數是隱藏的,不可直接調用,編譯器會在創建實例時自動處理。

值得注意的是,values()和valueOf(String s)這兩個靜態方法是由編譯器插入的,它們在所有枚舉類型中通用,且在轉型後的枚舉類中同樣適用。這表明,無論枚舉類型如何擴展,其基礎功能保持一致。

總結來說,通過本文,我們深入了解了Java枚舉類型中的方法特性和行為。通過之前的系列文章,我們已經對枚舉類型的原理和使用有了全面的認識。未來,我們將繼續深入探討其在實際項目中的應用,敬請期待更多相關內容的分享。

熱點內容
安卓的face怎麼使用 發布:2024-11-26 15:05:50 瀏覽:88
存儲魔力象限2016 發布:2024-11-26 15:04:47 瀏覽:865
QQ填寫驗證碼是歷史密碼是什麼 發布:2024-11-26 15:04:16 瀏覽:505
vs2017編譯文件無效或損毀 發布:2024-11-26 15:04:16 瀏覽:597
騰訊微信如何更改登錄密碼 發布:2024-11-26 14:57:46 瀏覽:21
pythondict參數 發布:2024-11-26 14:49:41 瀏覽:105
ubuntu安裝linux源碼 發布:2024-11-26 14:48:52 瀏覽:744
百度雲解壓密碼忘記 發布:2024-11-26 14:35:36 瀏覽:863
最差擬合演算法 發布:2024-11-26 14:21:17 瀏覽:739
指令式編程 發布:2024-11-26 14:16:24 瀏覽:19