是指將變量的值一一列出來,變量的值只限於列舉出來的值的範圍內。舉例:一週只有7天,一年只有12個月等。
回想單例設計模式:單例類是一個類只有一個實例
那麼多例類就是一個類有多個實例,但不是無限個數的實例,而是有限個數的實例。這才能是枚舉類。java
初版設計模式
public class Direction { // 建立幾個實例 public static final Direction FRONT = new Direction(); public static final Direction BEHIND = new Direction(); public static final Direction LEFT = new Direction(); public static final Direction RIGHT = new Direction(); // 構造私有,別人就不能無限的建立了 private Direction() { }
}
第二版ide
public class Direction2 { // 建立幾個實例 public static final Direction2 FRONT = new Direction2("前"); public static final Direction2 BEHIND = new Direction2("後"); public static final Direction2 LEFT = new Direction2("左"); public static final Direction2 RIGHT = new Direction2("右"); // 構造私有,別人就不能無限的建立了 // private Direction2() { // } // 加入成員變量,並去掉無參構造 private String name; private Direction2(String name) { this.name = name; } public String getName() { return name; } }
第三版測試
public abstract class Direction3 { // 建立幾個實例 public static final Direction3 FRONT = new Direction3("前") { @Override public void show() { System.out.println("前"); } }; public static final Direction3 BEHIND = new Direction3("後") { @Override public void show() { System.out.println("後"); } }; public static final Direction3 LEFT = new Direction3("左") { @Override public void show() { System.out.println("左"); } }; public static final Direction3 RIGHT = new Direction3("右") { @Override public void show() { System.out.println("右"); } }; // 構造私有,別人就不能無限的建立了 // private Direction2() { // } // 加入成員變量,並去掉無參構造 private String name; private Direction3(String name) { this.name = name; } public String getName() { return name; } // 加入抽象方法 public abstract void show(); }
測試this
public class DirectionDemo { public static void main(String[] args) { Direction d = Direction.FRONT; System.out.println(d); // cn.test_01.Direction@175078b System.out.println("------------------------------------"); Direction2 d2 = Direction2.FRONT; System.out.println(d2);// cn.testt_01.Direction2@11563ff System.out.println(d2.getName());//前 d2 = Direction2.RIGHT; System.out.println(d2); System.out.println(d2.getName());//右 System.out.println("------------------------------------"); Direction3 d3 = Direction3.FRONT; System.out.println(d3); System.out.println(d3.getName());//前 d3.show();//前 d3 = Direction3.LEFT; System.out.println(d3); System.out.println(d3.getName());//左 d3.show();//左 } }
發現本身定義一個枚舉類,比較麻煩,因此,java就提供了枚舉類供咱們使用spa
格式是:只有枚舉項的枚舉類
public enum 枚舉類名 {
枚舉項1,枚舉項2,枚舉項3…;
}.net
注意:設計
定義枚舉類要用關鍵字enum
全部枚舉類都是Enum的子類
枚舉類的第一行上必須是枚舉項,最後一個枚舉項後的分號是能夠省略的,可是若是枚舉類有其餘的東西,這個分號就不能省略。建議不要省略
枚舉類能夠有構造器,但必須是private的,它默認的也是private的。枚舉項的用法比較特殊:枚舉(「」);
枚舉類也能夠有抽象方法,可是枚舉項必須重寫該方法
枚舉在switch語句中的使用
初版code
/* * 經過JDK5提供的枚舉來作枚舉類 */ public enum Direction { FRONT, BEHIND, LEFT, RIGHT; }
第二版blog
/* * 經過JDK5提供的枚舉來作枚舉類 */ public enum Direction2 { FRONT("前"), BEHIND("後"), LEFT("左"), RIGHT("右"); private String name; private Direction2(String name) { this.name = name; } public String getName() { return name; } // @Override // public String toString() { // return "重寫toString方法"; // } }
第三版
/* * 經過JDK5提供的枚舉來作枚舉類 */ public enum Direction3 { FRONT("前") { @Override public void show() { System.out.println("前"); } }, BEHIND("後") { @Override public void show() { System.out.println("後"); } }, LEFT("左") { @Override public void show() { System.out.println("左"); } }, RIGHT("右") { @Override public void show() { System.out.println("右"); } }; private String name; private Direction3(String name) { this.name = name; } public String getName() { return name; } public abstract void show(); }
測試
public class DirectionDemo { public static void main(String[] args) { Direction d = Direction.FRONT; System.out.println(d); // FRONT // public String toString()返回枚舉常量的名稱,它包含在聲明中。 System.out.println("-------------"); Direction2 d2 = Direction2.FRONT; System.out.println(d2);//FRONT System.out.println(d2.getName());//前 System.out.println("-------------"); Direction3 d3 = Direction3.FRONT; System.out.println(d3);//FRONT System.out.println(d3.getName());//前 d3.show();//前 System.out.println("--------------"); Direction3 dd = Direction3.FRONT; dd = Direction3.LEFT; switch (dd) {//你選擇了左 case FRONT: System.out.println("你選擇了前"); break; case BEHIND: System.out.println("你選擇了後"); break; case LEFT: System.out.println("你選擇了左"); break; case RIGHT: System.out.println("你選擇了右"); break; } } }
int compareTo(E o) String name() int ordinal() String toString() <T> T valueOf(Class<T> type,String name) values() 此方法雖然在JDK文檔中查找不到,但每一個枚舉類都具備該方法,它遍歷枚舉類的全部枚舉值很是方便
測試
public class EnumMethodDemo { public static void main(String[] args) { // int compareTo(E o) Direction2 d21 = Direction2.FRONT; Direction2 d22 = Direction2.BEHIND; Direction2 d23 = Direction2.LEFT; Direction2 d24 = Direction2.RIGHT; System.out.println(d21.compareTo(d21));//0 System.out.println(d21.compareTo(d24));//-3 System.out.println(d24.compareTo(d21));//3 System.out.println("---------------"); // String name() System.out.println(d21.name());//FRONT System.out.println(d22.name());//BEHIND System.out.println(d23.name());//LEFT System.out.println(d24.name());//RIGHT System.out.println("--------------"); // int ordinal() System.out.println(d21.ordinal());//0 System.out.println(d22.ordinal());//1 System.out.println(d23.ordinal());//2 System.out.println(d24.ordinal());//3 System.out.println("--------------"); // String toString() System.out.println(d21.toString());//FRONT System.out.println(d22.toString());//BEHIND System.out.println(d23.toString());//LEFT System.out.println(d24.toString());//RIGHT System.out.println("--------------"); // <T> T valueOf(Class<T> type,String name) Direction2 d = Enum.valueOf(Direction2.class, "FRONT"); System.out.println(d.getName());//前 System.out.println("----------------"); // values() // 此方法雖然在JDK文檔中查找不到,但每一個枚舉類都具備該方法,它遍歷枚舉類的全部枚舉值很是方便 Direction2[] dirs = Direction2.values(); for (Direction2 d2 : dirs) { System.out.println(d2); System.out.println(d2.getName()); } } }
枚舉: