1.深入java枚舉類型

枚舉類型是JDK5.0的新特徵。Sun引進了一個全新的關鍵字enum來定義一個枚舉類。

下面就是一個典型枚舉類型的定義:

public enum Color{

RED,BLUE,YELLOW,GREEN;

}

顯然,enum很像特殊的class,實際上enum聲明定義的類型就是一個類,它是類庫中Enum類的子類(java.lang.Enum<E>)。它們繼承了這個Enum中的許多有用的方法。下面我們就詳細介紹enum定義的枚舉類的特徵及其用法。

1、Color枚舉類是特殊的class,其枚舉值(RED,BLUE...)是Color的類對象(類實例):
      Color c=Color.RED; 
而且這些枚舉值都是public static final的,也就是我們經常所定義的常量方式,因此枚舉類中的枚舉值最好全部大寫。

2、即然枚舉類是class,當然在枚舉類型中有構造器,方法和數據域。但是,枚舉類的構造器有很大的不同:
     (1) 構造器只是在構造枚舉值的時候被調用

     (2) 構造器只能私有private,絕對不允許有public構造器。這樣可以保證外部代碼無法新構造枚舉類的實例。這也是完全符合情理的,因爲我們知道枚舉值是public static final的常量而已。 但枚舉類的方法和數據域可以允許外部訪問。

enum Color{

RED(255,0,0),BLUE(0,0,255),YELLOW(255,255,0),GREEN(0,255,0);

private Color(int rv,int gv,int bv){

this.redValue=rv;

this.greenValue=gv;

this.blueValue=bv;

}

public String toString(){

return super.tpString() + "(" + redValue + "," + greenValue + "," + blueValue + ")";

}

private int redValue;

        private int greenValue;

        private int blueValue;

}

public void static main(String[] args){

//Color color = new Color(100,200,300);//這樣是錯誤的

Color color = Color.RED;

   System.out.println(color);//調用了toString()

}

3、所有枚舉類都繼承了Enum的方法,下面我們詳細介紹這些方法。
       (1)  ordinal()方法: 返回枚舉值在枚舉類種的順序。這個順序根據枚舉值聲明的順序而定。
                 Color.RED.ordinal();  //返回結果:0
                 Color.BLUE.ordinal();  //返回結果:1
       (2)  compareTo()方法: Enum實現了java.lang.Comparable接口,因此可以比較象與指定對象的順序。Enum中的compareTo返回的是兩個枚舉值的順序之差。當然,前提是兩個枚舉值必須屬於同一個枚舉類,否則會拋出ClassCastException()異常。(具體可見源代碼)
                 Color.RED.compareTo(Color.BLUE);  //返回結果 -1
       (3)  values()方法: 靜態方法,返回一個包含全部枚舉值的數組。
                 Color[] colors=Color.values();
                 for(Color c:colors){
                        System.out.print(c+","); 
                 }//返回結果:RED,BLUE,YELLOW,GREEN,
       (4)  toString()方法: 返回枚舉常量的名稱。
                 Color c=Color.RED;
                 System.out.println(c);//返回結果: RED
       (5)  valueOf()方法: 這個方法和toString方法是相對應的,返回帶指定名稱的指定枚舉類型的枚舉常量。
                 Color.valueOf("BLUE");   //返回結果: Color.BLUE
       (6)  equals()方法: 比較兩個枚舉類對象的引用。

4、枚舉類可以在switch語句中使用。

Color color = Color.RED;

switch(color){

case RED:
System.out.println("color is red");
            break;
case GREEN:
System.out.println("color is green");
            break;
case YELLOW:
System.out.println("color is yellow");
            break;
case BLUE:
            System.out.println("color is blue");
            break;

}

5、完整的例子

public class TestEnum {
/*1 最普通的枚舉*/
public enum ColorSelect{
RED,GREEN,YELLOW,BLUE;
}

/*2  枚舉也可以象一般的類一樣添加方法和屬性,你可以爲它添加靜態和非靜態的屬性或方法,
這一切都象你在一般的類中做的那樣*/
public enum Season{
//枚舉列表必須寫在最前面,否則編譯出錯
WINTER,SPRING,SUMMER,FALL;

private final static String location = "Phoenix";

public static Season getBest(){
if(location.equals("Phoenix")){
return WINTER;
}else{
return SUMMER;
}
}
}

/*3  枚舉還可以有構造方法*/
public enum Temp{
/*通過括號賦值,而且必須有帶參構造器和一屬性跟方法,否則編譯出錯
         * 賦值必須是都賦值或都不賦值,不能一部分賦值一部分不賦值
         * 如果不賦值則不能寫構造器,賦值編譯也出錯*/
absoluteZero(-459), freezing(32),boiling(212), paperBurns(451);

private final int value;

public int getValue() {
            return value;
        }

//構造器默認也只能是private, 從而保證構造函數只能在內部使用
        Temp(int value) {
            this.value = value;
        }
}

public static void main(String[] args) {
//枚舉類型是一種類型,用於定義變量,以限制變量的賦值 賦值時通過"枚舉名.值"來取得相關枚舉中的值
ColorSelect select = ColorSelect.BLUE;
switch(select){
//注意:枚舉重寫了ToString(),所以枚舉變量的值是不帶前綴的,所以爲blue而非ColorSelect.blue
case RED:
System.out.println("color is red");
            break;
case GREEN:
System.out.println("color is green");
            break;
case YELLOW:
System.out.println("color is yellow");
            break;
case BLUE:
            System.out.println("color is blue");
            break;
}

System.out.println("遍歷ColorSelect中的值:");
//通過values()獲得枚舉值的數組
for(ColorSelect c : ColorSelect.values()){
System.out.println(c);
}

System.out.println("枚舉ColorSelect中的值有:"+ColorSelect.values().length+"個");
//ordinal()返回枚舉值在枚舉中的索引位置(序號),從0開始
System.out.println(ColorSelect.RED.ordinal());//0
System.out.println(ColorSelect.GREEN.ordinal());//1
System.out.println(ColorSelect.YELLOW.ordinal());//2
System.out.println(ColorSelect.BLUE.ordinal());//3

//枚舉默認實現了java.lang.Comparable接口,值爲前面的索引值減去後面的索引值
System.out.println(ColorSelect.RED.compareTo(ColorSelect.GREEN));

//調用枚舉中的方法
System.out.println(Season.getBest());


//通過getValue()取得相關枚舉的值
for(Temp t :Temp.values()){
System.out.println(t+"的值是"+t.getValue());
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章