zoukankan      html  css  js  c++  java
  • [Java5新特性]枚举

    什么是枚举类型

    如果定义一个类来完成企业员工信息,员工信息包括姓名、年龄及职位等信息(职位只有WORKER、MANAGER及BOSS三个角色),具体完成代码如下:

    public class Demo {
        private String name;
        private Integer age;
        private String role;
        public String getRole() {
            return role;
        }
        public void setRole(String role) {
            this.role = role;
        }
    
        public static void main(String[] args) {
            Demo emp1 = new Demo();
            emp1.setRole("WORKER");
            Demo emp2 = new Demo();
            emp2.setRole("MANAGER");
            Demo emp3 = new Demo();
            emp3.setRole("老大");
    
            List<Demo1> list = new ArrayList<Demo1>();
            list.add(emp1);
            list.add(emp2);
            list.add(emp3);
    
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).getRole());
            }
        }
    }
    

    在上述代码中,我们可以看到在为员工设置职位角色时,可以设置不在要求中的其他角色。这样使得我们的代码安全很低(会出现意外值),还有就是代码的可读性并不是很好。我们可以将上述代码进行如下改写:

    public class Demo {
        private String role;
    
        public static void main(String[] args) {
            Demo emp1 = new Demo();
            emp1.role = Role.WORKER;
            Demo emp2 = new Demo();
            emp2.role = Role.MANAGER;
            Demo emp3 = new Demo();
            emp3.role = "老大";
    
            List<Demo2> list = new ArrayList<Demo2>();
            list.add(emp1);
            list.add(emp2);
            list.add(emp3);
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).role);
            }
        }
    }
    
    class Role {
        public static final String BOSS = "BOSS";
        public static final String MANAGER = "MANAGER";
        public static final String WORKER = "WORKER";
    }
    

    通过这样的改写之后,代码的可读性有所提高。但是,在职位角色上依旧可以出现意外的其他值,这样的结果是我们所不希望看到的。所以,我们需要继续改写上述代码:

    public class Demo {
        private Role role;
    
        public static void main(String[] args) {
            Demo emp1 = new Demo();
            emp1.role = Role.BOSS;
            Demo emp2 = new Demo();
            emp2.role = Role.MANAGER;
            Demo emp3 = new Demo();
            emp3.role = "老大"; // 这里这时会报错
    
            List<Demo3> list = new ArrayList<Demo3>();
            list.add(emp1);
            list.add(emp2);
            list.add(emp3);
    
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).role);
            }
        }
    }
    
    class Role {
        public static final Role BOSS = new Role();
        public static final Role MANAGER = new Role();
        public static final Role WORKER = new Role();
    
        private Role() { }
    }
    

    当上述代码改写到此时,代码安全性和可读性的问题都已解决。但是,Java 5版本提供了一种更简单的方式来解决这个问题:

    public class Demo {
        private Role role;
    
        public static void main(String[] args) {
            Demo emp = new Demo();
            emp.role = Role.BOSS;
        }
    }
    
    enum Role {
        WORKER, MANAGER, BOSS;
    }
    

    这里的“enum”关键字表示枚举类型,意思就是说在职位中具有WORKER、MANAGER及BOSS三种职位,并且只能在这三种中选择。而枚举类型中的WORKER、MANAGER及BOSS三个成员实际上都是一个Role对象。

    枚举与switch

    通过上面的讨论,我们可以看到枚举很适合在switch语句中使用,下面我们来看个案例代码:

    public class Demo {
        private Role role;
    
        public static void main(String[] args) {
            Demo emp = new Demo();
            emp.role = Role.BOSS;
            switch (emp.role) {
            case WORKER:
                System.out.println("这是员工角色.");
                break;
            case MANAGER:
                System.out.println("这是经理角色.");
                break;
            case BOSS:
                System.out.println("这是老板角色.");
                break;
        }
    }
    
    enum Role {
        WORKER, MANAGER, BOSS;
    }
    

    注意的是,在switch语句中,不能使用枚举类名称,例如“case Role.WORKER”。因为编译器会根据switch语句中的emp.role来判断每个枚举类型。

    枚举类型的构造器

    在枚举类中具有默认的构造器,也可以自定义构造器。但是,在自定义构造器时,还是需要注意一些问题的。

    使用默认构造器的代码如下:

    public enum Role {
        WORKER, MANAGER, BOSS;
    
        private Role() { }
    }
    

    需要注意的是:

    • 如果要定义构造器的话,在最后一个枚举项添加分隔符“;”。
    • 构造器只能使用private修饰符。

    使用自定义构造器的代码如下:

    public enum Role {
        WORKER("WORKER"), MANAGER("MANAGER"), BOSS("BOSS");
    
        private Role(String role) {
            System.out.println(role);
        }
    }
    

    如果自定义构造器接收参数的话,在枚举项中需要传递对应的信息。具体做法就是在枚举项后添加“()”,直接传递即可。

    枚举类型的成员

    在枚举类中不仅可以包含构造器,还可以包含成员变量和成员方法。例如以下代码:

    public enum Role {
        WORKER, MANAGER, BOSS;
    
        private String role;
    
        public String getRole() {
            return role;
        }
        public void setRole(String role) {
            this.role = role;
        }
    }
    

    但是需要注意的是无论是构造器还是成员,枚举类中首先一定要定义的是枚举项,其他内容必须在枚举项后面。

    枚举类中还可以包含抽象方法:

    public enum Role {
        WORKER {
            @Override
            public void show() {
                System.out.println("WORKER");
    
            }
        },
        MANAGER {
            @Override
            public void show() {
                System.out.println("MANAGER");
    
            }
        },
        BOSS {
            @Override
            public void show() {
                System.out.println("MANAGER");
    
            }
        };
    
        public abstract void show();
    
    }
    

    当然,如果枚举类包含抽象方法的话,枚举项必须实现该抽象方法。

    枚举类型常用API

    实际上,我们所使用的枚举类都是java.lang.Enum类的子类,并继承了Enum类的所有方法。常用方法如下:

    • name():获取枚举项的名称。
    • ordinal():获取枚举项的索引值,索引值从“0”开始。
    • valueof(Class enumClass, String name):获取对应枚举类对象。

    自定义的枚举类的常用方法如下:

    • valueof(String name):获取对应枚举类对象。
    • values():此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。

    转载说明:请注明作者及原文链接,谢谢!

  • 相关阅读:
    操作系统
    MarkDown语法实操
    mac 添加环境变量
    在django中建立mysql数据表时发生的低级错误
    models.Book.object.get()与models.Book.object.filter()区别
    django中数据库操作时distinct的用法
    ‘,’逗号并不是字符串的拼接方式
    django单表操作中update_or_create不能更新多于一个数据的信息
    在python中terminal中建立mysql数据库,无法再models.py 文件中建立数据库信息
    booleanfield()和booleanfield(default=True)在数据库的表中无法插入
  • 原文地址:https://www.cnblogs.com/longestory/p/4566984.html
Copyright © 2011-2022 走看看