java中的枚举

一、枚举初认识

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);
      }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值