詳解枚舉

1、本節主要點web

一、 什麼是枚舉;數組

二、 枚舉的特徵; dom

三、 枚舉的經常使用方法; ide

四、總結;this

2、枚舉的概念spa

     枚舉,簡單來講,就是把 變量的值一一列出來,這些值必須在列舉的範圍內。Java 在5.0版本纔開始支持枚舉類型的。code

      那我就想知道它5.0 以前,沒有枚舉的時候,是如何處理枚舉能解決的問題的?orm

  2.1 假設一個需求blog

       根據一個輸入參數,能夠知道它是星期幾。繼承

  2.2 程序實現

package com.panpan.web.domain.meiju;

/**  JDK 5.0 以前的實現
 * Created by hp on 14-7-20.
 */
public class OldMei {

    public void printDay(int day) {
        switch (day) {
            case 1:
                System.out.println("今天是星期一,上班");
                break;
            case 2:
                System.out.println("今天是星期二,上班");
                break;
            case 3:
                System.out.println("今天是星期三,上班");
                break;
            case 4:
                System.out.println("今天是星期四,上班");
                break;
            case 5:
                System.out.println("今天是星期五,上班");
                break;
            case 6:
                System.out.println("今天是星期六,上班或者不上班");
                break;
            case 7:
                System.out.println("今天是星期日,休息");
                break;
            default:
                System.out.println("哥也不懂今天是星期幾了");
        }
    }

    public static void main(String[] args) {
        OldMei oldMei = new OldMei();
        oldMei.printDay(12);
    }

}

上述代碼雖然能完成咱們的需求,同時也有個問題,就是假設我輸入7之外的數據,調用者也不懂發生了什麼。因此,這個作法的容錯性並很差。

2.3 告訴調用者參數不正確

接着上面的程序,咱們會想到在default 分支上拋出一個異常。告訴調用者參數不正確。

case 7:
                System.out.println("今天是星期日,休息");
                break;
            default:
                throw new ParamsExcepiton();

這樣能夠解決了。仔細一想,printDay 這樣簡單的方法同時還要作驗證參數的事情。能不能從源頭就把不符合規範的參數排除了呢?

2.4 枚舉告訴你,這能夠

public void printDay(DayEnum day){
        switch (day) {
            case MONDAY:
                System.out.println("今天是星期一,上班");
                break;
            case TUESDAY:
                System.out.println("今天是星期二,上班");
                break;
            case WEDNESDAY:
                System.out.println("今天是星期三,上班");
                break;
            case THURSDAY:
                System.out.println("今天是星期四,上班");
                break;
            case FRIDAY:
                System.out.println("今天是星期五,上班");
                break;
            case SATURDAY:
                System.out.println("今天是星期六,上班或者不上班");
                break;
            case SUNDAY :
                System.out.println("今天是星期日,休息");
                break;
        }
    }

    public static void main(String[] args) {
        OldMei oldMei = new OldMei();
        oldMei.printDay(DayEnum.FRIDAY);
    }

這樣作以後,你會發現只能給printDay 枚舉中的參數了。實現了在入參時期進行規則校驗的目的。

3、枚舉的特徵

如上,DayEnum 就是class,並且是一個不能夠被繼承的final類。因此這些就是 public static final 的變量。

既然是class ,那就有構造器,方法啊,域的。它的構造器只能私有private,能夠保證外部代碼沒法構造新的實例。

3.1 全部枚舉類都繼承了Enum的方法。

(1)ordinal() , 返回枚舉中順序

public final int ordinal() {
    return ordinal;
    }

(2)compareTo() ,返回兩個枚舉順序之差。

int i = DayEnum.MONDAY.compareTo(DayEnum.FRIDAY);
        System.out.println(i);

(3)values(),返回所有枚舉值的數組。

 

等等,還有valueOf,toString。不一一介紹了。

 

4、一些用法

(1) 枚舉中的普通方法

package com.panpan.web.domain.meiju;

/**
 * Created by hp on 14-7-20.
 */
public enum DayEnum {
    MONDAY("1","星期一"),
    TUESDAY("2","星期二"),
    WEDNESDAY("3","星期三"),
    THURSDAY("4","星期四"),
    FRIDAY("5","星期五"),
    SATURDAY("6","星期六"),
    SUNDAY("7","星期日")   ;

    private String index;
    private String description;

    DayEnum(String index, String description) {
        this.index = index;
        this.description = description;
    }
     // 普通方法
    public DayEnum geDayEnum(String index) {
        DayEnum[] values = DayEnum.values();
        for (DayEnum value : values) {
            if (value.getIndex().equals(index)) {
                return value;
            }
        }
        return null;
    }

    public String getIndex() {
        return index;
    }

    public void setIndex(String index) {
        this.index = index;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

經過普通方法,你只要調用getDayEnum(),就能夠知道是哪一個DayEnum 。不再用冗長的if,else 了。

(2)實現接口

public enum DayEnum implements SayHelloWorld{
    MONDAY("1","星期一"),
    TUESDAY("2","星期二"),
    WEDNESDAY("3","星期三"),
    THURSDAY("4","星期四"),
    FRIDAY("5","星期五"),
    SATURDAY("6","星期六"),
    SUNDAY("7","星期日")   ;

    private String index;
    private String description;

    DayEnum(String index, String description) {
        this.index = index;
        this.description = description;
    }

     @Override
     public void sayHi() {
         System.out.println("hello wo am panpan");
     }

    @Override
    public void goodBye() {
        System.out.println("good bye");
    }
    public String getIndex() {
        return index;
    }

    public void setIndex(String index) {
        this.index = index;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
(3) 接口中使用枚舉類
public interface Color {

    enum Hot implements Color{
        RED,YELLOW
    }
}

其實就至關於定義一個常量。

 

(4)關於枚舉集合的使用(EnumMap 和 EnumSet)

Map<DayEnum,String> eunmMap = new EnumMap<DayEnum,String>(DayEnum.class);
        eunmMap.put(DayEnum.FRIDAY, "星期五啦,明天能夠玩了,哈哈");
        eunmMap.put(DayEnum.SATURDAY, "星期六啦,明天能夠玩了,哈哈");

5、小結

枚舉雖然不難,可是仍是總結一下。

  • 枚舉能夠約束傳入的參數
  • 枚舉是一個特殊的類,final類型,因此不能被繼承。
  • 枚舉能夠實現其餘接口
相關文章
相關標籤/搜索