1.枚举概述
是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。
回想单例设计模式:单例类是一个类只有一个实例
那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例。这才能是枚举类。
2.通过自己定义一个枚举类来演示案例
第一版
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() { }
}
第二版
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(); }
测试
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就提供了枚举类供我们使用
3.枚举
格式是:只有枚举项的枚举类
public enum 枚举类名 {
枚举项1,枚举项2,枚举项3…;
}
注意:
定义枚举类要用关键字enum
所有枚举类都是Enum的子类
枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);
枚举类也可以有抽象方法,但是枚举项必须重写该方法
枚举在switch语句中的使用
第一版
/* * 通过JDK5提供的枚举来做枚举类 */ public enum Direction { FRONT, BEHIND, LEFT, RIGHT; }
第二版
/* * 通过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; } } }
4.枚举类中的几个常见方法
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()); } } }
枚举: