文章目录
一、枚举初认识
1、为什么要使用枚举?
枚举被规定的常量,但不同于Java中的常量的地方是**:每一个枚举元素都是一个对象**,且他的值只能使用我们定义过的枚举实例,在外面只能调用,不能修改;
- 这是一个用普通类模拟的枚举类
public class WeekDay {
private String day;
private Integer index;
private WeekDay(String day, Integer index){
this.day=day;
this.index = index;
}
public final static WeekDay SUN = new WeekDay("SUN", 0);
public final static WeekDay MON = new WeekDay("MON", 1);
public String getDay() {
return day;
}
public Integer getIndex() {
return index;
}
}
public class EnumTest {
public static void main(String[] args){
WeekDay mon = WeekDay.MON;
System.out.println(mon.getDay() + "---------->" + mon.getIndex());
}
}
2. 使用java enum关键字创建枚举
- 修改上面自定义的枚举类
enum WeekDay {
SUN ("SUN", "周一"),
MON ("MON", "周二"),
THI ("THI", "周三");
private String day;
private String index;
private WeekDay(String day, String index){
this.day=day;
this.index = index;
}
}
- 简单的枚举
enum WeekDay {
SUN,MON,THI;
}
二、案例
1.交通灯
import org.junit.Test;
enum EnumTraffic {
RED, YELLOW,GREEN;
}
public class EnumTest2{
private EnumTraffic enumTraffic = EnumTraffic.RED;
public void change() {
switch (enumTraffic){
case RED:
this.enumTraffic = EnumTraffic.YELLOW;
break;
case YELLOW:
this.enumTraffic = EnumTraffic.GREEN;
break;
case GREEN:
this.enumTraffic = EnumTraffic.RED;
break;
default:
break;
}
}
@Test
public void tests(){
while (true){
System.out.println(this.enumTraffic);
this.change();
}
}
}
2.枚举构造器(属性多态)
import org.junit.Test;
import java.util.Arrays;
enum Redirect {
NORTH("北方"), SOUTH("南方"),WEST("西方"), EAST("东方");
private String name;
// 枚举构造方法
Redirect(String name){ this.name = name;}
public String getName(){
return this.name;
}
}
public class EnumTest3 {
@Test
public void test(){
Redirect east = Redirect.EAST;
System.out.println(east.name());
System.out.println(east.ordinal());
System.out.println(east.getName());
Arrays.stream(Redirect.values()).forEach(e->{
System.out.println("====" + e);
});
System.out.println(Redirect.valueOf("EAST"));
}
}
3.枚举实现接口或者抽象方法(方法的多态),就可以个性化使用方法;比如说某个方法要在不同场景使用不同的逻辑时
import org.junit.Test;
import java.util.Arrays;
enum Redirect implements Say{
NORTH("北方") {
@Override
public void doSomething() {
System.out.println("北方到了");
}
}, SOUTH("南方") {
@Override
public void doSomething() {
System.out.println("南方到了");
}
},WEST("西方") {
@Override
public void doSomething() {
System.out.println("西方到了");
}
}, EAST("东方") {
@Override
public void doSomething() {
System.out.println("东方到了");
}
};
private String name;
// 枚举构造方法
Redirect(String name){ this.name = name;}
public String getName(){
return this.name;
}
}
interface Say{
void doSomething();
}
public class EnumTest3 {
@Test
public void test(){
Redirect east = Redirect.EAST;
Redirect north = Redirect.NORTH;
east.doSomething();
north.doSomething();
}
}
4.枚举包装错误码
- 设计一个接口,接口定义了状态码,消息信息以及获取方式
public interface MExceptionEnum{
/**
* 获取状态码
* @return 状态码
* /
public String getCode();
/**
* 获取提示信息
* @return 提示信息
* /
public String getMessage();
}
- 设计枚举类,实现上述接口,定义了具体的异常信息和状态码,当有新的状态码时,只需要添加一条对应的信息即可
public enum ExceptionEnum implements MExceptionEnum{
//自定义的状态码
DATABASE_EXCEPTION("2000","数据库连接异常"),
MONITOR_EXCEPTION("2001","文件监控异常")
;
//错误码
public String code;
//提示信息
public String message;
//构造函数
ExceptionEnum(String code,String message){
this.code = code;
this.message = message;
}
//获取状态码
public String getCode(){
return code;
}
//获取提示信息
public String getMessage(){
return message;
}
}
- 创建一个异常类,可在整个类中通用,根据不同得场景,抛出不同的异常信息
//此处异常类得名字建议用项目名加上Exception,整个项目的通用异常
public class MiException extends RuntimeException{
private ExceptionEnum exceptionEnum;
public MiException(ExceptionEnum exceptionEnum){
this.exceptionEnum = exceptionEnum;
}
public ExceptionEnum getExceptionEnum(){
return exceptionEnum;
}
//用来输出异常信息和状态码
public void printException(MiException e){
ExceptionEnum exceptionEnum = e.getExceptionEnum();
System.out.println("异常代码:" + exceptionEnum.getCode() + ",异常信息:" + exceptionEnum.getMessage());
}
}
- 至此自定义异常就结束了,现在写一个测试类感受一下
public class MiTest{
public static void main(String []args){
try{
throw new MiException(ExceptionEnum.DATABASE_EXCEPTION);
}catch(MiException e){
e.printException(e);
}
}
}