在JDK1.5之前啄寡,JAVA可以有兩種方式定義新類型:類和接口拾弃,對于大部分面向對象編程讯檐,有這兩種似乎就足夠了羡疗,但是在一些特殊情況就不合適。例如:想要定義一個Color類别洪,它只能有Red,Green,Blue三種叨恨,其他值則是錯誤,在JDK1.5之后便引入枚舉類型挖垛。
用法一:常量
在JDK1.5 之前痒钝,我們定義常量都是: public static fianl…. ,枚舉可以將相關的常量分組到一個枚舉類型里,而且枚舉提供了比常量更多的方法晕换。
public enum Color {
RED, GREEN, BLANK, YELLOW
}
Color c = Color.BLUE ; // 取出藍色
System.out.println(c) ;
用法二:switch
JDK1.5起switch語句支持Enum枚舉值午乓,使用枚舉站宗,能讓我們的代碼可讀性更強闸准。
public class SwitchEnum {
Color color = Color.RED;
public void change() {
switch (color) {
case RED:
color = Color.GREEN;
break;
case YELLOW:
color = Color.RED;
break;
case GREEN:
color = Color.YELLOW;
break;
}
}
}
用法三:向枚舉中添加新方法
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
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;
}
}
用法四:覆蓋枚舉的方法
下面給出一個toString()方法覆蓋的例子。
public enum Color {
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);
// 成員變量
private String name;
private int index;
// 構造方法
private Color(String name, int index) {
this.name = name;
this.index = index;
}
//覆蓋方法 ,可自定義返回
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
用法五:實現(xiàn)接口
所有的枚舉都繼承自java.lang.Enum類梢灭。由于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;
// 構造方法
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.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重復库快;EnumMap中的key是enum類型摸袁,而value則可以是任意類型。
- 使用EnumMap
import java.util.EnumMap ;
import java.util.Map ;
enum Color{
RED , GREEN , BLUE ;
}
public class EnumMapDemo{
public static void main(String args[]){
Map<Color,String> desc = null ; // 定義Map對象义屏,同時指定類型
desc = new EnumMap<Color,String>(Color.class) ; // 實例化EnumMap對象
desc.put(Color.RED,"紅色") ;
desc.put(Color.GREEN,"綠色") ;
desc.put(Color.BLUE,"藍色") ;
System.out.println("====== 輸出全部的內容 ======") ;
for(Color c:Color.values()){
System.out.println(c.name() + " --> " + desc.get(c)) ;
}
System.out.println("====== 輸出全部的鍵值 ======") ;
for(Color c:desc.keySet()){
System.out.print(c.name() + "靠汁、") ;
}
System.out.println() ;
System.out.println("====== 輸出全部的內容 ======") ;
for(String s:desc.values()){
System.out.print(s + "、") ;
}
}
};
- 使用 EnumSet
import java.util.EnumSet ;
enum Color{
RED , GREEN , BLUE ;
}
public class EnumSetDemo{
public static void main(String args[]){
EnumSet<Color> esOld = null ; // 聲明一個EnumSet對象
EnumSet<Color> esNew = null ;
System.out.println("======== EnumSet.copyOf(Color.class) =====") ;
esOld = EnumSet.noneOf(Color.class) ; // 將枚舉的全部類型設置到EnumSet對象之中
esOld.add(Color.RED) ; // 增加內容
esOld.add(Color.GREEN) ; // 增加內容
esNew = EnumSet.copyOf(esOld) ; // 從已有的集合拷貝過來
print(esNew) ;
}
public static void print(EnumSet<Color> temp){ // 專門的輸出操作
for(Color c:temp){ // 循環(huán)輸出EnumSet中的內容
System.out.print(c + "闽铐、") ;
}
System.out.println() ;
}
};