北京行——java基础加强之枚举
枚举
Java的新特性的一步步更新其实就是把错误今早的发现,枚举也在一定的程度上起到了这个作用,是java越来越友好和方便
枚举的引入:
?------将已经知道的值在枚举重定义出来(坦克的方向、员工的角色、交通的指向),它的取值就是那几个值,但是在应用时候可以增加程序的可读性。用数字赋值的时候,比如用1来代表某一个值,但是如果赋错了值,但是符合定义类型,这就错误了。所以就引入了枚举。(我认为在这个地方也可以使用常量来代替)《疑问解决》这个地方在赋值的时候仍然出现了可以赋别的值得问题,用这个方法可以在一定程度上解决可读性的问题。String role = RoleUtil.Boss;<这个地方是可以赋别的值得>
主要解决的问题:1、可读性 2、非法数据
枚举就是简化了在JDK5.0时候的类的编写,也可以说是封装了,实例如下:
public class EnumTest { @Test public void test() { Role r1 = Role.Manger; Role r2 = Role.employee; // Role r3 = new Role();// 定义了私有的构造函数 Role1 r4 = Role1.Manger; } } class Role { public static final Role Manger = new Role();// 这个这样写的目的是提高程序的可读性 public static final Role work = new Role(); public static final Role employee = new Role(); private Role() {// 这样写的目的是为了防止数据非法 }; } enum Role1 {// 上边这个类是和枚举类是等价的,也就是被封装了底层的实现 Manger, work, employee; }
若枚举重只有一个元素,这就是典型的单例模式
单例模式
?为什么引入,等在请看随笔中
枚举练习:《星期 用中文返回 用两种方法》
public void test2() { WeekDay fir = WeekDay.Mon; fir.show();// 这个地方是用到的方法的调用 WeekDay tu = WeekDay.Tu; tu.show1(); }
enum WeekDay { Mon {// 这个地方用到的是匿名内部类 @Override public void show1() { System.out.println("Mon"); } }, Tu { @Override public void show1() { System.out.println("Tu"); } }, Wen { @Override public void show1() { System.out.println("Wen"); } }; public void show() {// 这是一种方法,是自己写一个方法,不过有点麻烦 if (this.name().equals("Mon")) {// 这个地方省略了判断 System.out.println("Mon"); } } public abstract void show1(); }
以上的两种写法要掌握。但是为什么写是一个疑问?希望在后面会有所涉及
枚举API的应用
先上实例:
enum WeekDay { Mon {// 这个地方用到的是匿名内部类 @Override public void show1() { System.out.println("Mon"); } }, Tu { @Override public void show1() { System.out.println("Tu"); } }, Wen { @Override public void show1() { System.out.println("Wen"); } }; public void show() {// 这是一种方法,是自己写一个方法,不过有点麻烦 if (this.name().equals("Mon")) {// 这个地方省略了判断 System.out.println("Mon"); } } public abstract void show1(); }
public void test3() {// 这个地方时枚举API的使用有五个 // 1、已知枚举对象,获得下标和名称 WeekDay wen = WeekDay.Wen; System.out.println(wen.ordinal()); System.out.println(wen.name()); // 2、已知枚举下标,获取枚举对象和名称,获取实例有两种方法valueOf和values int index = 2; WeekDay wen1 = WeekDay.values()[index]; System.out.println(wen1.name());// 这里用的还是相当不错的 // 3、已知对象名称获取下标和实例,下面的很重要,要熟悉 String name = "Wen"; WeekDay wen2 = Enum.valueOf(WeekDay.class, name); WeekDay wen3 = WeekDay.valueOf(name); System.out.println(wen2 + "---"); System.out.println(wen3 + "---"); }