你们知道枚举是怎么实现的吗?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ZackSock/article/details/100904776

一、枚举的由来

先假定一个场景,现在有一个需求。要求你创建一个员工类(Employee),其中有一个属性角色role。而公司中有BOSS、MANAGER、WORKER三种角色。那么这个类要怎么定义,我们一步一步慢慢实现这个类。

我们先把属性role设置为String,那么Employee类如下定义:

class Employee{
        
    private String name;
    
    private String role;

    /** 省略一些方法 **/
    
    public Employee(String role){
        this.role = role;
    }

}

这个时候就可以来分别创建三个角色不同的员工:

@Test
public void demo1(){
    Employee boss = new Employee("BOSS");
    Employee manager = new Employee("MANAGER");
    Employee worker = new Employee("WORKER");        

    //但是如果单词拼错了,程序就会出问题
    Employee boss2 = new Employee("BOS");
}

这样显然有很多问题,于是我们可以尝试用int,这样就不容易出错:

class Employee{
    private int role;
}

假定1是BOSS、2是MANAGER、3是WORKER。那么创建的时候就可以如下:

@Test
public void demo2(){
    Employee boss = new Employee(1);
    Employee manager = new Employee(2);
    Employee worker = new Employee(3);        

    //但是如果赋其它值,也会出问题
    Employee worker = new Employee(4);        

}

这个时候如果赋其它值还是会出问题,而且代码可读性也差了许多。于是想到用静态变量:

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

这个时候就可以用静态变量赋值:

@Test
public void demo3(){
    Employee boss = new Employee(Role.BOSS);
    Employee manager = new Employee(Role.MANAGER);
    Employee worker = new Employee(Role.WORKER);        

    //但是这个时候还是可以赋值其它数字
    Employee boss2 = new Employee(4);
}

这个时候可读性就强了,但是还是存在安全问题。这个时候就可以把role的类型改成其它自定义对象。我们把Role对象修改一下:

class Role{
    public static final Role BOSS = new Role();
    public static final Role MANAGER = new Role();
    public static final Role WORKER = new Role();
}

这个时候好像是没问题了,我们来赋值看看:

@Test
public void demo4(){
    Employee boss = new Employee(Role.BOSS);
    Employee manager = new Employee(Role.MANAGER);
    Employee worker = new Employee(Role.WORKER);        

    //这个时候还是可以new一个匿名Role()
    Employee boss2 = new Employee(new Role());
}

这个时候,还是有不安全的地方。其实这个好解决,只要把构造器设为私有的就好了。那么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(){
    
    }
}

这样就写出了一个枚举类了。而JDK本身就提供了枚举的实现,具体实现也很简答:

enum Role{
    BOSS, MANAGER, WORKER;
}

这个枚举Role和上面的Role类有相同的效果,他们写法是等价的。

二、枚举详解

接下来讲讲枚举的相关知识。

1、创建和使用:这个在上面已经说的很清楚了,这里带过一下。

enum Role{
    item1, item2, item3,....;
}

2、枚举的有参构造

enum Role{
    //传入参数在枚举对象后加括号传入参数
    BOSS(1), MANAGER(3), WORKER(5);    

    //private可以去掉,在enum中构造方法默认为private(不能为public)
    private Role(int level){
        
    }
}

3、枚举中定义抽象方法

enum Role{
    //在枚举中以匿名实现抽象方法
    BOSS{
        public void say(){
            System.out.println("我就是无聊想说句话");
        }        

    }, MANAGER{
        public void say(){
            System.out.println("我也无聊想说句话");
        }        

    };

    public abstract void say(){

    }

}

4、枚举常用API

枚举类都是基础java.lang.Enum类的,这里我们来讲讲Enum的常用方法:

public void demo4(){
    Role role = Role.BOSS;
    
    //返回枚举的名称BOSS
    String name = role.name();
    
    //返回枚举的下标
    int index = role.ordinal();

    //把对应的字符串name转成enumClass类的枚举对象
    Role boss = Enum.valueOf(Role.class, "BOSS");
}

猜你喜欢

转载自blog.csdn.net/ZackSock/article/details/100904776