为什么要枚举类型?
可以将常量组织起来,统一进行管理。
常用于状态码,错误码。
本质:受限制的类 枚举类(class),枚举实例(对象)
类内使用 类内枚举
常用方法
- ENUM.values() 返回所有枚举值,按声明顺序返回 枚举类名.values()
- ENUM.valueOf(ENUM)
- ENUMOBJ.name()返回 具体的枚举值(对象名)
- ENUMOBJ.equals() :判断是否为同一个对象。可以使用 == 来比较enum实例。
- ENUMOBJ.ordinal() 返回实例在enum中声明的次序(类似数组index)
类内枚举(类似内部类)
enum TYPE {value1,value2,...};
enum GENDER {MALE,FEMALE};
//类内遍历 ENUM.values() 返回的是个数组
for (GENDER g : GENDER.values()) {
System.out.println(g+ " ordinal: " + g.ordinal());
}
//创建实例对象
GENDER man = GENDER.MALE;
man.name(); //MALE
man.ordinal();// 0 (FEMALE实例对象 是1)
//获取enum的类型 (GENDER)
man.getDeclaringClass();
遍历
public class Demo {
// 枚举颜色
enum Color {RED, GREEN, BLUE;}
public static void main(String args[]) {
Color list[] = Color.values();
for(int i=0;i<list.length;i++)
System.out.println(list[i]);
for(Color c: Color.values()){
System.out.println(c);
}
}
}
枚举类(单独使用)
同类一样,分为属性+方法两部分。
1.先写构造函数与必须属性,确定属性枚举值的样式
private int code;
private String description;
ErrorCode(int number, String description) {
this.code = number;
this.description = description;
}
2.自定义属性 (逗号分割!逗号分隔!逗号分隔!分号结尾)
OK(0, "成功"),
ERROR_A(100, "登录成功"),
ERROR_C(-100, "登录失败"),
ERROR_B(200, "注册成功");
3.定义其他方法
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
public static void eachPrint() { // 静态方法
for (ErrorCode s : ErrorCode.values()) {
System.out.println("code: " + s.getCode() + ", description: " + s.getDescription());
}
}
整体概览
public enum ConstantEnum {
SUCCESS(0), //这就是先写构造方法的用途,其实这都是实例对象(OBJ),可以定义他们自己的方法(也就是每个不同的枚举对象可以有不同的操作,只需要实现接口,override即可)
REGISTERED(10),
NEEDED_REGISTERED(20),
PASSWORD_ERROR(30),
ERROR(40),
DB_EXISTS_ALREADY(50);
private int statusNum;
ConstantEnum(int value){
this.statusNum = value;
}
public int getStatusNum(){return this.statusNum;}
public static void printAll(){
for(ConstantEnum constantEnum:ConstantEnum.values()){
System.out.println(constantEnum.ordinal()+" declaring pos:"+constantEnum );
}
}
}
使用枚举代替if-else
对于不同角色,有不同的操作,使用if-else当然可以解决。但是耦合性很高。
我们可以使用 接口+枚举角色实现接口功能 的方式,实现动态执行不同操作的需求。
假设男人女人不同操作,定义接口(男人女人都要操作)
public interface Operations {
String ops();
}
然后使用枚举类实现接口
public enum Gender implements Operations {
MALE("man"){
@Override
public String ops(){
return "man go to work daylight in the past";
}
},
FEMALE("woman"){
@Override
public String ops(){
return "WOman go to work daylight too";
}
};
private String gender;
Gender(String sex){
this.gender = sex;
}
}
测试:
public class Demo {
static Gender gender = Gender.FEMALE;
public static void main(String args[]) {
System.out.println(gender.ops());
}
}