java中的枚举类

1、枚举的由来

假如有一个员工类

public class Employee {
    public String id; // 编号
    public String name; // 姓名
    // 定义 员工角色 : 1、 BOSS 、 2 MANAGER 、3、WORKER (三选一)

    //很久很久之前,没有枚举,采用int 常量代替,把员工角色定义到一个类中 可读性还可以,安全性很差 employee1.role1= 100; 造成程序错误
    public int role1;

    // 很久之前,人们自定义一个带有枚举功能类,采用对象来标识
    public Role2 role2;

    // JDK5 提供枚举 简化自定义枚举类写法
    public Role3 role3;

  public static void main(String[] args) {
        //int常量标识不同的员工角色
        Employee employee1 = new Employee();
        employee1.role1 = Role1.BOSS;
        
        //对象标识不同的员工角色
        Employee employee2 = new Employee();
        employee2.role2= Role2.BOSS;
        
        //枚举来标识
        Employee employee3 = new Employee();
        employee3.role3= Role3.BOSS;
    }

}

//int常量标识不同的员工角色

class Role1 {
    public static final int BOSS = 1;
    public static final int MANAGER = 2;
    public static final int WORKER = 3;
}

//使用对象来标识不同的角色

class Role2{
    public static final Role2 BOSS = new Role2();
    public static final Role2 MANAGER = new Role2();
    public static final Role2 WORKER = new Role2();
    private role2(){}//私有构造器
}

// 枚举定义来标识
enum Role3 {
    BOSS, MANAGER, WORKER;
    // 构造器必须私有
    private Role3() {}
}

2、枚举API的使用

定义一个枚举类:Hobby,比如音乐,运动,学习

enum Hobby{
    MUSIC,SPORT,STUDY;
    private Hobby(){}
}

根据已知的枚举对象的属性,获取其他的属性

public class EnumAPITest {
    @Test
    public void method_3(){
        int index = 1;//已知枚举下标,获取枚举对象和名称
        Hobby []hobbies = Hobby.values();//先获取所有的枚举对象数组
        //获取枚举对象
        Hobby hobby = hobbies[index];//根据下标找到枚举对象
        System.out.println(hobby.name()); //SPORT
    }
    @Test
    public void method_2(){
        String name = "STUDY";//已知枚举名称,获取对象和下标
        //通过枚举名称获得枚举对象,有两种方式
        Hobby hobby = Hobby.valueOf(name);
        Hobby hobby2 = Enum.valueOf(Hobby.class, name);
        //有了对象就可以获取下标了
        System.out.println(hobby.ordinal());//2
        System.out.println(hobby2.ordinal());//2
    }
    @Test
    public void method_1(){
        Hobby hobby = Hobby.MUSIC;
        //已知枚举对象,由枚举对象来获取枚举名称和下标
        System.out.println(hobby.name());//MUSIC
        System.out.println(hobby.ordinal());//0
    }
}

3、枚举构造器有参数或枚举类中有抽象方法的情况

public class EnumTest {
    public static void main(String[] args) {
        Color color = Color.BLUE;
        color.show();        
    }
}
//如果枚举构造器有参数,在枚举实例后 () 传入参数
//如果枚举有抽象方法,解决用匿名内部类 实现抽象方法
enum Color{
    RED(3){
        @Override
        void show() {
            System.out.println("hong");
        }
    },
    BLUE(4){
        @Override
        void show() {
            System.out.println("lan");
        }
    },
    BLACK(5){
        @Override
        void show() {
            System.out.println("hei");
        }
    };
    private Color(int x){};
    abstract void show();
}

以上很多都是依据当时学习时老师的范例,不管怎么说,希望对大家有所帮助!!!

posted @ 2016-01-22 11:28  庄生梦蝶  阅读(199)  评论(0编辑  收藏  举报