一、枚举的由来
先假定一个场景,现在有一个需求。要求你创建一个员工类(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");
}
https://mp.weixin.qq.com/s/8uCBw43_0n9-Z4y_wK1TEg