枚舉類型可以取代以往常量的定義方式,即將常量封裝在類或接口中。此外,枚舉類型還提供了安全檢查功能。枚舉類型本質(zhì)上還是以類的形式存在。
以往設(shè)置常量,通常將常量放置在接口中,這樣在程序中就可以直接使用了,并且該常量不能被修改,因為在接口中定義的常量時,該常量的修飾符為final與static。
- public interface Constants
- {
- public static final int RED = 1;
- public static final int BLUE = 2;
- public static final int GREEN = 3;
- }
使用枚舉定義常量的語法如下:
- public enum ColorEnum
- {
- RED,
- BLUE,
- GREEN
- }
命名規(guī)范:
final常量:使用大寫字母命名,并且中間使用下劃線進(jìn)行連接。
enum枚舉:使用大寫字母命名,并且中間使用下劃線進(jìn)行連接。
示例:枚舉類型的使用。
- public static void doit(ColorEnum c)
- {
- switch (c)
- {
- case RED:
- System.out.println("This is RED");
- break;
- case BLUE:
- System.out.println("This is BLUE");
- break;
- case GREEN:
- System.out.println("This is GREEN");
- break;
- default:
- break;
- }
- }
- public static void main(String[] args)
- {
- doit(ColorEnum.RED);
- }
枚舉類型較傳統(tǒng)定義常量的方式,除了具有參數(shù)類型檢測的優(yōu)勢之外,還具有其他方面的優(yōu)勢。
用戶可以將一個枚舉類型看作是一個類,它繼承于java.lang.Enum類,當(dāng)定義一個枚舉類型時,每一個枚舉類型成員都可以看作是枚舉類型的一個實例,這些枚舉類型成員默認(rèn)都被final、public、static所修飾,所以當(dāng)使用枚舉類型成員時直接使用枚舉類型名稱調(diào)用枚舉類型成員即可。
由于枚舉類型對象繼承與java.lang.Enum類,所以該類中一些操作枚舉類型的方法都可以應(yīng)用到枚舉型中。
枚舉類型的常用方法:
方法名稱 | 具體含義 | 使用方法 |
---|---|---|
values() | 該方法可以將枚舉類型成員以數(shù)組的形式返回 | 枚舉類型名稱.values() |
valueOf() | 該方法可以實現(xiàn)將普通字符串轉(zhuǎn)換為枚舉實例 | 枚舉類型名稱.valueOf("ABC") |
compareTo() | 該方法用于比較兩個枚舉對象在定義時的順序 | 枚舉對象.compareTo() |
ordinal() | 該方法用于得到枚舉成員的位置索引 | 枚舉對象.ordinal() |
(1)values()方法
該方法可以將枚舉類型成員以數(shù)組的形式返回,也可以通過該方法獲取枚舉類型的成員。
示例:使用枚舉類型中的values()方法獲取枚舉類型中的成員變量。
- /**
- * 使用枚舉類型中的values()方法獲取枚舉類型中的成員變量
- *
- * @author pan_junbiao
- *
- */
- public class ShowEnum
- {
- enum ColorEnum
- {
- RED, BLUE, GREEN
- }
- // 循環(huán)由values()方法返回的數(shù)組
- public static void main(String[] args)
- {
- System.out.println("方式一:");
- for (int i = 0; i < ColorEnum.values().length; i++)
- {
- // 將枚舉成員變量打印
- System.out.println("枚舉類型成員變量:" + ColorEnum.values()[i]);
- }
- System.out.println("方式二:");
- for (ColorEnum c : ColorEnum.values())
- {
- // 將枚舉成員變量打印
- System.out.println("枚舉類型成員變量:" + c);
- }
- }
- }
執(zhí)行結(jié)果:
(2)valueOf()與compareTo()方法
枚舉類型中靜態(tài)方法valueOf()可以實現(xiàn)將普通字符串轉(zhuǎn)換為枚舉實例,而compareTo()方法用于比較兩個枚舉對象在定義時的順序。
示例:枚舉中valueOf()與compareTo()方法的使用。
- /**
- * 枚舉中valueOf()與compareTo()方法的使用
- *
- * @author pan_junbiao
- *
- */
- public class EnumMethodTest
- {
- enum ColorEnum
- {
- RED, BLUE, GREEN
- }
- // 定義比較枚舉類型方法,參數(shù)類型為枚舉類型
- public static void compare(ColorEnum c)
- {
- // 根據(jù)values()方法返回的數(shù)組做循環(huán)操作
- for (int i = 0; i < ColorEnum.values().length; i++)
- {
- // 將比較結(jié)果返回
- System.out.println(c + "與" + ColorEnum.values()[i] + "的比較結(jié)果為:" + c.compareTo(ColorEnum.values()[i]));
- }
- }
- public static void main(String[] args)
- {
- // 使用valueOf()將字符串轉(zhuǎn)換為枚舉實例
- ColorEnum c = ColorEnum.valueOf("BLUE");
- compare(c);
- }
- }
執(zhí)行結(jié)果:
說明:調(diào)用compareTo()方法返回的結(jié)果,正值代表方法中的參數(shù)在調(diào)用該方法的枚舉對象位置之前;0代表兩個相互比較的枚舉成員的位置相同;負(fù)值代表方法中參數(shù)在調(diào)用該方法的枚舉對象位置之后。
(3)ordinal()方法
該方法用于得到枚舉成員的位置索引。
示例:枚舉中ordinal()方法的使用。
- /**
- * 枚舉中ordinal()方法的使用
- *
- * @author pan_junbiao
- *
- */
- public class EnumOrdinalTest
- {
- public enum ColorEnum
- {
- RED, BLUE, GREEN
- }
- public static void main(String[] args)
- {
- for (int i = 0; i < ColorEnum.values().length; i++)
- {
- // 在循環(huán)中獲取枚舉類型成員的索引位置
- System.out.println(ColorEnum.values()[i] + "在枚舉類型中位置索引值" + ColorEnum.values()[i].ordinal());
- }
- }
- }
執(zhí)行結(jié)果:
在枚舉類型中,可以添加構(gòu)造方法,但是規(guī)定這個構(gòu)造方法必須為private修飾符修飾。
示例:在枚舉類型中,可以添加構(gòu)造方法。
- /**
- * 在枚舉類型中添加構(gòu)造方法
- *
- * @author pan_junbiao
- *
- */
- public class EnumIndexTest
- {
- enum ColorEnum
- {
- RED(1, "我是紅色"), BLUE(2, "我是藍(lán)色"), GREEN(3, "我是綠色");
- private final int value;
- private final String description;
- private ColorEnum(int value, String description)
- {
- this.value = value;
- this.description = description;
- }
- public int getValue()
- {
- return this.value;
- }
- public String getDescription()
- {
- return this.description;
- }
- public static ColorEnum valueOf(int value)
- {
- switch (value)
- {
- case 1:
- return ColorEnum.RED;
- case 2:
- return ColorEnum.BLUE;
- case 3:
- return ColorEnum.GREEN;
- default:
- return null;
- }
- }
- }
- public static void main(String[] args)
- {
- for (ColorEnum c : ColorEnum.values())
- {
- System.out.println("枚舉成員:" + c + " 值:" + c.getValue() + " 描述:" + c.getDescription());
- }
- System.out.println("值轉(zhuǎn)換成枚舉:" + ColorEnum.valueOf(2));
- System.out.println("字符串轉(zhuǎn)換成枚舉:" + ColorEnum.valueOf("GREEN"));
- }
- }
執(zhí)行結(jié)果:
除了可以使用上述示例的方法定義getDescription()方法獲取枚舉類型成員變量是的描述之外,還可以將這個getDescription()方法放置在接口中,使枚舉類型實現(xiàn)接口,然后使每個枚舉類型實現(xiàn)接口中的方法。
示例:在項目中創(chuàng)建d接口和枚舉類型的AnyEnum類,在枚舉類型AnyEnum類中實現(xiàn)帶方法的接口,使每個枚舉類型成員實現(xiàn)該接口中的方法。
- interface d
- {
- public int getValue();
- public String getDescription();
- }
- /**
- * 枚舉中實現(xiàn)接口
- *
- * @author pan_junbiao
- *
- */
- public enum AnyEnum implements d
- {
- RED
- {
- public int getValue()
- {
- return 1;
- }
- public String getDescription()
- {
- return "我是紅色";
- }
- },
- BLUE
- {
- public int getValue()
- {
- return 2;
- }
- public String getDescription()
- {
- return "我是藍(lán)色";
- }
- },
- GREEN
- {
- public int getValue()
- {
- return 3;
- }
- public String getDescription()
- {
- return "我是綠色";
- }
- };
- public static void main(String[] args)
- {
- for (AnyEnum c : AnyEnum.values())
- {
- System.out.println("枚舉成員:" + c + " 值:" + c.getValue() + " 描述:" + c.getDescription());
- }
- }
- }
執(zhí)行結(jié)果:
枚舉類型聲明提供了一種用戶友好的變量定義方法,枚舉了某種數(shù)據(jù)類型所有可能出現(xiàn)的值??偨Y(jié)枚舉類型,它具有以下特點:
(1)類型安全。
(2)緊湊有效的數(shù)據(jù)定義。
(3)可以和程序其他部分完美交互。
(4)運行效率高。