枚举
枚举的概念:
枚举是在一定范围内取值,并且这个值必须是枚举类型中的任意一个,并且只能有一个。枚举的本质就是一个Java类。
注意事项:
- 1.必须在规定范围内取值
- 2.这个值只能取一个
- 3.这个值可以是规定范围内的任意一个
枚举的引入
public enum Direction {
//实例列表末尾的分号是可选的
NORTH, SOUTH, EAST, WEST
}
Direction类型的实例可以按静态变量的方式引用:Direction.NORTH,Direction.EAST
在开发中枚举可以用来定义常量
public enum ServiceCode {
SYSTEM_NORMAL(200, "系统正常"),
//异常 返回码范围 400 -419 业务无关异常
INVALID_PARAM(401,"无效参数"),
//服务端异常
SERVICE_ERROR(500, "服务异常");
private int code;
private String desc;
ServiceCode(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
枚举的特点
1.枚举中所有的成员,必须出现在枚举对象的下面
2.如果枚举类中有一个成员,那么 枚举对象最后不能省略分号
3.枚举中构造方法必须私有
4.抽象方法有意义,可以用来描述某个枚举成员的信息,提高程序的可读性
5.枚举也是switch语句中的常量形式之一
- switch语句中可以有哪些?
- byte short int char String 枚举
public class EnumDemo {
public static void main(String[] args) {
Color c = Color.GREEN;
// c.show();
// Color.RED.desc();
switch (c) {
case RED:
Color.RED.desc();
break;
case GREEN:
Color.GREEN.desc();
break;
case YELLOW:
Color.YELLOW.desc();
break;
default:
break;
}
}
}
enum Color {
RED {
@Override
public void desc() {
System.out.println("我是红色");
}
},
GREEN {
@Override
public void desc() {
System.out.println("我是绿色");
}
},
YELLOW {
@Override
public void desc() {
System.out.println("我是黄色");
}
};
private Color() {
}
private Color(int num) {
this.num = num;
}
public void show() {
System.out.println("show");
}
public abstract void desc();
}
枚举中常用的方法
- String name()
- 返回此枚举常量的名称,与其枚举声明中声明的完全相同。
- int ordinal()
- 返回此枚举常数的序数(其枚举声明中的位置,其中初始常数的序数为零)。
- static <T extends Enum>
- T valueOf(类 enumType, String name)
- 返回具有指定名称的指定枚举类型的枚举常量。
- T valueOf(String name)
- T[] values();
public class EnumDemo {
public static void main(String[] args) {
// method01(TrafficLight.GREEN);
// method02("GREEN");
// method03(2);
TrafficLight t = TrafficLight.valueOf(TrafficLight.class, "GREEN");
System.out.println(t);
}
/**
* 已知枚举的下标,获取枚举的名称,枚举的对象
*/
public static void method03(int index) {
// values方法返回枚举数组
TrafficLight trafficLight = TrafficLight.values()[index];
System.out.println(trafficLight);
String name = trafficLight.name();
System.out.println(name);
}
/**
* 已知枚举的名称,获取枚举的下标和枚举对象
*/
public static void method02(String name) {
// T valueOf(String name)
TrafficLight trafficLight = TrafficLight.valueOf(name);
int index = trafficLight.ordinal();
System.out.println(trafficLight + ":" + index);
}
/**
* 已知枚举对象,获取枚举的下标和名称
*/
public static void method01(Enum<TrafficLight> e) {
System.out.println(e.ordinal() + ":" + e.name());
}
}
enum TrafficLight{
RED, GREEN, YELLOW
}
案例:使用枚举来描述一个星期多少天,要求枚举中用抽象方法来描述每一天,并且要使用switch测试。
public class EnumDemo {
public static void main(String[] args) {
Weekend day = Weekend.SATURDAY;
switch (day) {
case MONDAY:
Weekend.MONDAY.desc();
break;
case TUESDAY:
Weekend.TUESDAY.desc();
break;
case WEDNESDAY:
Weekend.WEDNESDAY.desc();
break;
case THURSDAY:
Weekend.THURSDAY.desc();
break;
case FRIDAY:
Weekend.FRIDAY.desc();
break;
case SATURDAY:
Weekend.SATURDAY.desc();
break;
case SUNDAY:
Weekend.SUNDAY.desc();
break;
default:
System.out.println("非法星期");
break;
}
}
}
enum Weekend {
MONDAY {
@Override
void desc() {
System.out.println("星期一");
}
},
TUESDAY {
@Override
void desc() {
System.out.println("星期二");
}
},
WEDNESDAY {
@Override
void desc() {
System.out.println("星期三");
}
},
THURSDAY {
@Override
void desc() {
System.out.println("星期四");
}
},
FRIDAY {
@Override
void desc() {
System.out.println("星期五");
}
},
SATURDAY {
@Override
void desc() {
System.out.println("星期六");
}
},
SUNDAY {
@Override
void desc() {
System.out.println("星期天");
}
};
abstract void desc();
}