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; } }
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、小結
枚舉雖然不難,可是仍是總結一下。