Java枚舉類

來源:互聯網
上載者:User

標籤:

Java枚舉類 (2009-01-13 11:37:01) 轉載▼
標籤: java enum 枚舉 it 分類: 編程

1.建立一個最簡單的枚舉類型

建立枚舉類型要使用enum關鍵字,隱含了所建立的類型都是java.lang.Enum類的子類,它是抽象類別。其中,枚舉類型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 建構函式中,在這裡,每個值的名稱都被轉換成一個字串,並且序數設定表示了此設定被建立的順序。

public enum Size{
        SMALL,
        MEDIUM,
        LARGE;
}

實際上調用了三次建構函式:

new Enum<Size>("SMALL",0);
new Enum<Size>("MEDIUM",1);
new Enum<Size>("LARGE",2);

值的名字和順序值可以分別通過name()/toString()、ordinal()獲得。

自建的枚舉類除了繼承Enum類的方法外還會自動獲得兩個方法values()和valueOf(String name)。不需要自己定義就可以直接使用。這其中的原理我不太清楚,麻煩明白的人給我講講。

values()可以用來遍曆枚舉類中的值,valueOf(String name)可以用來通過名字獲得具體的枚舉值。

獲得枚舉類值的方法:有三種方式,具體見代碼。

 public class MostSimpleEnum {

    public enum Size{
        SMALL,
        MEDIUM,
        LARGE;
    }


    public static void main(String[] args){
        //兩種獲得枚舉類型的方法
        Size s1 = Size.SMALL;
        Size s2 = Enum.valueOf(Size.class, "SMALL");
        Size s3 = Size.valueOf("MEDIUM");//1

        //直接使用‘=’來比較兩個枚舉類型是否相等
        if(Size.LARGE == Enum.valueOf(Size.class, "LARGE")){
            System.out.println("Size.LARGE == Enum.valueOf(Size.class, \"LARGE\")");
        }

        //結果同上,枚舉重載了equals方法,但比較方法同上
        System.out.println("Size.MEDIUM.equals(Enum.valueOf(Size.class, \"MEDIUM\")):"+
                Size.MEDIUM.equals(Enum.valueOf(Size.class, "MEDIUM")));

        //遍曆枚舉類型中所有的成員
        for(Size s:Size.values()){//2
            //1.定義的序號 2.定義的名稱 3.在Enum中被重載,同name()
            System.out.println(s.ordinal()+"  "+s.name()+"  "+s.toString());
        }

        //分析在抽象類別Enum中沒有定義的兩個方法values()和valuesOf()的來曆
        analyzeEnum(s1);

        //定義的枚舉類預設繼承的抽象類別java.lang.Enum
        //有兩個特殊的方法,我們並沒有定義,結果卻顯示來自我們自定定義的類
        //前面都已經使用過的,1.valueOf(String name),2.values()
        //枚舉類自動包括這兩個事先被定義好的方法
        System.out.println("獲得"+s3);
    }

    public static void analyzeEnum(Enum e){
        System.out.println("class:"+e.getClass().getName());
        System.out.println("declear class:"+e.getClass().getDeclaringClass());
        System.out.println("super class:"+e.getClass().getSuperclass().getName());
        Class<?>[] interfaces = e.getClass().getInterfaces();
        for(Class c:interfaces){
            System.out.println("implement interdace:"+c.getName());
        }

        Method[] methods = e.getClass().getMethods();
        for(Method m:methods){
            System.out.println("mehtods:"+m.getName()+"  from:"+m.getDeclaringClass());
        }
    }
}

 

  2.建立一個複雜點的枚舉類Week,在這個枚舉類中我們為它添加自己定義的成員、構造器、方法。注意雖然在Enum中有構造器,但是我們無法在自訂的枚舉類中調用它,直接繼承java.lang.Enum也是不允許的。我們自己定義的構造器只能被定義成private或者package-protected,同樣在我們也無法調用這個自訂的構造器。

public enum Week {
    //定義枚舉類的值
    Monday("MON","星期一"),
    Tuesday("TUE","星期二"),
    Wednesday("WED","星期三"),
    Thursday("THU","星期四"),
    Friday("FRI","星期五"),
    Saturday("SAT","星期六"){
        @Override
        public boolean isRest(){
            return true;
        }
    },
    Sunday("SUN","星期日"){
        @Override
        public boolean isRest(){
            return true;
        }
    };

    private String abbreviation = "";//縮寫
    private String chineseName = "";//中文名字

 

    //定義自己的構造器

    private Week(String abbreviation,String chineseName){
        this.abbreviation = abbreviation;
        this.chineseName = chineseName;
    }

    public String abbreviation(){
        return abbreviation;
    }

    public String getChineseName(){
        return chineseName;
    }

 

    //周六和周日應該返回true,此方法在周六和周日的值中被重載

    public boolean isRest(){
        return false;
    }

   

    //重載,對它進行稍稍的改動

    @Override

    public String toString(){
        return this.getClass().getName()+"."+this.name();
    }
}

 

 

//測試Week

public class WeekTest {
    public static void main(String[] args){
        for(Week week:Week.values()){
            System.out.println("-----------------------------------------");
            System.out.println("ordinal():"+week.ordinal());
            System.out.println("name():"+week.name());
            System.out.println("getChineseName():"+week.getChineseName());
            System.out.println("abbreviation():"+week.abbreviation());
            System.out.println("isRest():"+week.isRest());
            System.out.println("toString():"+week.toString());//如果此方法沒有被重載,與name()功能相同.
            System.out.println("getDeclaringClass():"+week.getDeclaringClass());
        }
    }
}

 

順便說一下,繼承或實現介面的方法和一般Java類是相同的。

 

Java枚舉類 - 比較兩個枚舉對象Java枚舉類 - 枚舉的集合
參考: 馴服 Tiger: 深入研究枚舉類型 http://www-128.ibm.com/developerworks/cn/java/j-tiger04195/Java 1.5新特性Enum的用法   http://conkeyn.javaeye.com/blog/232757

Java枚舉類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.