Java的Enumeration(枚舉,注釋②)便是具有這些限制的一個(gè)反復(fù)器的例子。除下面這些外,不可再用它做其他任何事情:
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站建設(shè)、阿克塞哈薩克族自治網(wǎng)絡(luò)推廣、小程序制作、阿克塞哈薩克族自治網(wǎng)絡(luò)營(yíng)銷、阿克塞哈薩克族自治企業(yè)策劃、阿克塞哈薩克族自治品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供阿克塞哈薩克族自治建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
(1)
用一個(gè)名為elements()的方法要求集合為我們提供一個(gè)Enumeration。我們首次調(diào)用它的nextElement()時(shí),這個(gè)Enumeration會(huì)返回序列中的第一個(gè)元素。
(2)
用nextElement()獲得下一個(gè)對(duì)象。
(3)
用hasMoreElements()檢查序列中是否還有更多的對(duì)象。
②:“反復(fù)器”這個(gè)詞在C++和OOP的其他地方是經(jīng)常出現(xiàn)的,所以很難確定為什么Java的開(kāi)發(fā)者采用了這樣一個(gè)奇怪的名字。Java
1.2的集合庫(kù)修正了這個(gè)問(wèn)題以及其他許多問(wèn)題。
用法一:常量
在JDK1.5 之前,我們定義常量都是: public static fianl.... ?,F(xiàn)在好了,
有了枚舉,可以把相關(guān)的常量分組到一個(gè)枚舉類型里,而且枚舉提供了比常量更多的方法。
Java代碼
public enum Color {
RED, GREEN, BLANK, YELLOW
}
用法二:switch
JDK1.6之前的switch語(yǔ)句只支持int,char,enum類型,使用枚舉,能讓我們的代碼可讀性更強(qiáng)。
Java代碼
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
用法三:向枚舉中添加新方法
如果打算自定義自己的方法,那么必須在enum實(shí)例序列的最后添加一個(gè)分號(hào)。而且 Java 要求必須先定義 enum 實(shí)例。
Java代碼
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
// 普通方法
public static String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
return null;
}
// get set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
用法四:覆蓋枚舉的方法
下面給出一個(gè)toString()方法覆蓋的例子。
Java代碼
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆蓋方法
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
用法五:實(shí)現(xiàn)接口
所有的枚舉都繼承自java.lang.Enum類。由于Java 不支持多繼承,所以枚舉對(duì)象不能再繼承其他類。
Java代碼
public interface Behaviour {
void print();
String getInfo();
}
public enum Color implements Behaviour{
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構(gòu)造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
return this.name;
}
//接口方法
@Override
public void print() {
System.out.println(this.index+":"+this.name);
}
}
用法六:使用接口組織枚舉
Java代碼
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
private static void testImplementsInterface() {
for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {
System.out.print(dessertEnum + " ");
}
System.out.println();
//我這地方這么寫(xiě),是因?yàn)槲以谧约簻y(cè)試的時(shí)候,把這個(gè)coffee單獨(dú)到一個(gè)文件去實(shí)現(xiàn)那個(gè)food接口,而不是在那個(gè)接口的內(nèi)部。
for (CoffeeEnum coffee : CoffeeEnum.values()) {
System.out.print(coffee + " ");
}
System.out.println();
//搞個(gè)實(shí)現(xiàn)接口,來(lái)組織枚舉,簡(jiǎn)單講,就是分類吧。如果大量使用枚舉的話,這么干,在寫(xiě)代碼的時(shí)候,就很方便調(diào)用啦。
//還有就是個(gè)“多態(tài)”的功能吧,
Food food = Food.DessertEnum.CAKE;
System.out.println(food);
food = CoffeeEnum.BLACK_COFFEE;
System.out.println(food);
}
Java中的枚舉是什么?他的具體用法是什么呢?
枚舉就是把集合里的對(duì)象元素
一個(gè)一個(gè)提取出來(lái)!比如說(shuō)
你買了一合巧克力
里面有草莓味的
有香草口味的
有蘋(píng)果口味的
你想把他們拿出來(lái)
就必須用“手”一個(gè)一個(gè)把他們拿出來(lái)
并且一次只能取一個(gè)哦
這里的手就是枚舉器
你取的動(dòng)作就是枚舉的過(guò)程
具體的用法
這個(gè)我就不好說(shuō)了
推薦
你看看JDK1.5的API和參考別人的范例
看完了
基本可以理解
枚舉幾種選擇(有迭代器和枚舉器2種)和如何判斷是否已經(jīng)取完了對(duì)象元素
等等
我不是很喜歡講語(yǔ)法
所以不好意思我就不給你丟代碼了~
Java語(yǔ)言中的枚舉類型的使用方法如下:
用法一:常量;
public?enum?Color?{??
RED,?GREEN,?BLANK,?YELLOW??
}
用法二:switch;
enum?Signal?{
GREEN,?YELLOW,?RED
}
public?class?TrafficLight?{
Signal?color?=?Signal.RED;
public?void?change()?{
switch?(color)?{
case?RED:
color?=?Signal.GREEN;
break;
case?YELLOW:
color?=?Signal.RED;
break;
case?GREEN:
color?=?Signal.YELLOW;
break;
}
}
}
用法三:向枚舉中添加新方法;
public?enum?Color?{
RED("紅色",?1),?GREEN("綠色",?2),?BLANK("白色",?3),?YELLO("黃色",?4);
//?成員變量
private?String?name;
private?int?index;
//?構(gòu)造方法
private?Color(String?name,?int?index)?{
this.name?=?name;
this.index?=?index;
}
//?普通方法
public?static?String?getName(int?index)?{
for?(Color?c?:?Color.values())?{
if?(c.getIndex()?==?index)?{
return?c.name;
}
}
return?null;
}
//?get?set?方法
public?String?getName()?{
return?name;
}
public?void?setName(String?name)?{
this.name?=?name;
}
public?int?getIndex()?{
return?index;
}
public?void?setIndex(int?index)?{
this.index?=?index;
}
}
用法四:覆蓋枚舉的方法;
public?class?Test?{
public?enum?Color?{
RED("紅色",?1),?GREEN("綠色",?2),?BLANK("白色",?3),?YELLO("黃色",?4);
//?成員變量
private?String?name;
private?int?index;
//?構(gòu)造方法
private?Color(String?name,?int?index)?{
this.name?=?name;
this.index?=?index;
}
//?覆蓋方法
@Override
public?String?toString()?{
return?this.index?+?"_"?+?this.name;
}
}
public?static?void?main(String[]?args)?{
System.out.println(Color.RED.toString());
}
}
用法五:實(shí)現(xiàn)接口;
public?interface?Behaviour?{
void?print();
String?getInfo();
}
public?enum?Color?implements?Behaviour?{
RED("紅色",?1),?GREEN("綠色",?2),?BLANK("白色",?3),?YELLO("黃色",?4);
//?成員變量
private?String?name;
private?int?index;
//?構(gòu)造方法
private?Color(String?name,?int?index)?{
this.name?=?name;
this.index?=?index;
}
//?接口方法
@Override
public?String?getInfo()?{
return?this.name;
}
//?接口方法
@Override
public?void?print()?{
System.out.println(this.index?+?":"?+?this.name);
}
}
用法六:使用接口組織枚舉。
public?interface?Food?{
enum?Coffee?implements?Food?{
BLACK_COFFEE,?DECAF_COFFEE,?LATTE,?CAPPUCCINO
}
enum?Dessert?implements?Food?{
FRUIT,?CAKE,?GELATO
}
}
以上就是Java語(yǔ)言中枚舉類型的基本使用方法。
java 枚舉類型enum 的使用
最近跟同事討論問(wèn)題的時(shí)候,突然同事提到我們?yōu)槭裁磈ava 中定義的常量值不采用enmu 枚舉類型,而采用public final static 類型來(lái)定義呢?以前我們都是采用這種方式定義的,很少采用enum 定義,所以也都沒(méi)有注意過(guò),面對(duì)突入起來(lái)的問(wèn)題,還真有點(diǎn)不太清楚為什么有這樣的定義。既然不明白就抽時(shí)間研究下吧。
Java 中的枚舉類型采用關(guān)鍵字enum 來(lái)定義,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum 類型。要了解枚舉類型,建議大家先打開(kāi)jdk 中的Enum類簡(jiǎn)單讀一下,這個(gè)類里面定義了很多protected 方法,比如構(gòu)造函數(shù),如果要使用這些方法我們可以把枚舉類型定義到當(dāng)前類中。每個(gè)枚舉類型,都有自己的名字和順序,當(dāng)我們輸出一個(gè)枚舉類型的時(shí)候,會(huì)輸入枚舉類型的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;
}
二、 枚舉類型定義常量方法
枚舉類型的簡(jiǎn)單定義方法如下,我們似乎沒(méi)辦法定義每個(gè)枚舉類型的值。比如我們定義紅燈、綠燈和黃燈的代碼可能如下:
public enum Light {
RED , GREEN , YELLOW ;
}
我們只能夠表示出紅燈、綠燈和黃燈,但是具體的值我們沒(méi)辦法表示出來(lái)。別急,既然枚舉類型提供了構(gòu)造函數(shù),我們可以通過(guò)構(gòu)造函數(shù)和覆寫(xiě)toString方法來(lái)實(shí)現(xiàn)。首先給Light 枚舉類型增加構(gòu)造方法,然后每個(gè)枚舉類型的值通過(guò)構(gòu)造函數(shù)傳入對(duì)應(yīng)的參數(shù),同時(shí)覆寫(xiě)toString 方法,在該方法中返回從構(gòu)造函數(shù)中傳入的參數(shù),改造后的代碼如下:
public enum Light {
// 利用構(gòu)造函數(shù)傳參
RED (1), GREEN (3), YELLOW (2);
// 定義私有變量
private int nCode ;
// 構(gòu)造函數(shù),枚舉類型只能為私有
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 {
// 利用構(gòu)造函數(shù)傳參
RED (1), GREEN (3), YELLOW (2);
// 定義私有變量
private int nCode ;
// 構(gòu)造函數(shù),枚舉類型只能為私有
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 對(duì)象的使用
System. out .println( " 演示 EnmuMap 對(duì)象的使用和遍歷 ....." );
testEnumMap ();
// 3. 演示 EnmuSet 的使用
System. out .println( " 演示 EnmuSet 對(duì)象的使用和遍歷 ....." );
testEnumSet ();
}
/**
* 演示枚舉類型的遍歷
*/
private static void testTraversalEnum() {
Light[] allLight = Light.values ();
for (Light aLight : allLight) {
System. out .println( " 當(dāng)前燈 name : " + aLight.name());
System. out .println( " 當(dāng)前燈 ordinal : " + aLight.ordinal());
System. out .println( " 當(dāng)前燈: " + aLight);
}
}
/**
* 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不過(guò) key 要是枚舉類型
*/
private static void testEnumMap() {
// 1. 演示定義 EnumMap 對(duì)象, EnumMap 對(duì)象的構(gòu)造函數(shù)需要參數(shù)傳入 , 默認(rèn)是key 的類的類型
EnumMapLight, String currEnumMap = new EnumMapLight, String(
Light. class );
currEnumMap.put(Light. RED , " 紅燈 " );
currEnumMap.put(Light. GREEN , " 綠燈 " );
currEnumMap.put(Light. YELLOW , " 黃燈 " );
// 2. 遍歷對(duì)象
for (Light aLight : Light.values ()) {
System. out .println( "[key=" + aLight.name() + ",value="
+ currEnumMap.get(aLight) + "]" );
}
}
/**
* 演示 EnumSet 如何使用, EnumSet 是一個(gè)抽象類,獲取一個(gè)類型的枚舉類型內(nèi)容BR/
* 可以使用 allOf 方法
*/
private static void testEnumSet() {
EnumSetLight currEnumSet = EnumSet.allOf (Light. class );
for (Light aLightSetElement : currEnumSet) {
System. out .println( " 當(dāng)前 EnumSet 中數(shù)據(jù)為: " + aLightSetElement);
}
}
}
執(zhí)行結(jié)果如下:
演示枚舉類型的遍歷 ......
當(dāng)前燈 name : RED
當(dāng)前燈 ordinal : 0
當(dāng)前燈: 1
當(dāng)前燈 name : GREEN
當(dāng)前燈 ordinal : 1
當(dāng)前燈: 3
當(dāng)前燈 name : YELLOW
當(dāng)前燈 ordinal : 2
當(dāng)前燈: 2
演示 EnmuMap 對(duì)象的使用和遍歷 .....
[key=RED,value= 紅燈 ]
[key=GREEN,value= 綠燈 ]
[key=YELLOW,value= 黃燈 ]
演示 EnmuSet 對(duì)象的使用和遍歷 .....
當(dāng)前 EnumSet 中數(shù)據(jù)為: 1
當(dāng)前 EnumSet 中數(shù)據(jù)為: 3
當(dāng)前 EnumSet 中數(shù)據(jù)為: 2
四、 通常定義常量方法和枚舉定義常量方法區(qū)別
以下內(nèi)容可能有些無(wú)聊,但絕對(duì)值得一窺
1. 代碼:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
有什么不好了,大家都這樣用了很長(zhǎng)時(shí)間了,沒(méi)什么問(wèn)題啊。
首先,它不是類型安全的。你必須確保是int
其次,你還要確保它的范圍是0 和1
最后,很多時(shí)候你打印出來(lái)的時(shí)候,你只看到 1 和0 ,
但其沒(méi)有看到代碼的人并不知道你的企圖,拋棄你所有舊的public static final 常量
2. 可以創(chuàng)建一個(gè)enum 類,把它看做一個(gè)普通的類。除了它不能繼承其他類了。(java 是單繼承,它已經(jīng)繼承了Enum),
可以添加其他方法,覆蓋它本身的方法
3. switch() 參數(shù)可以使用enum 了
4. values() 方法是編譯器插入到enum 定義中的static 方法,所以,當(dāng)你將enum 實(shí)例向上轉(zhuǎn)型為父類Enum 是,values() 就不可訪問(wèn)了。解決辦法:在Class中有一個(gè)getEnumConstants() 方法,所以即便Enum 接口中沒(méi)有values() 方法,我們?nèi)匀豢梢酝ㄟ^(guò)Class 對(duì)象取得所有的enum 實(shí)例
5. 無(wú)法從enum 繼承子類,如果需要擴(kuò)展enum 中的元素,在一個(gè)接口的內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉,以此將元素進(jìn)行分組。達(dá)到將枚舉元素進(jìn)行分組。
6. 使用EnumSet 代替標(biāo)志。enum 要求其成員都是唯一的,但是enum 中不能刪除添加元素。
7. EnumMap 的key 是enum ,value 是任何其他Object 對(duì)象。
8. enum 允許程序員為eunm 實(shí)例編寫(xiě)方法。所以可以為每個(gè)enum 實(shí)例賦予各自不同的行為。
9. 使用enum 的職責(zé)鏈(Chain of Responsibility) . 這個(gè)關(guān)系到設(shè)計(jì)模式的職責(zé)鏈模式。以多種不同的方法來(lái)解決一個(gè)問(wèn)題。然后將他們鏈接在一起。當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),遍歷這個(gè)鏈,直到鏈中的某個(gè)解決方案能夠處理該請(qǐng)求。
10. 使用enum 的狀態(tài)機(jī)
11. 使用enum 多路分發(fā)
在Java中,枚舉類型本質(zhì)上其實(shí)就是一個(gè)類,枚舉中的常量都是該枚舉類型的實(shí)例。雖然枚舉類型有一些限制,比如不能再派生出子枚舉類型,不能調(diào)用構(gòu)造函數(shù),不過(guò)我們?nèi)匀豢梢栽诿杜e類型中定義構(gòu)造函數(shù)、字段和方法