1、什么时候用枚举

如果类的对象是有限个,确定的,那么我们就可以用枚举类。枚举理解成一一列举。
比如支付状态和订单状态:

支付方式:cash(现金) WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、
Returen(退货)、Checked(已确认)

当需要定义一组常量时,强烈建议使用枚举类

jdk中用枚举的例子:
线程的状态:

public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
    }
2、自定义枚举类

jdk1.5之前我们需要自己定义枚举类:
(1)声明Season对象的属性:private final 修饰
(2)构造器私有化 因为枚举类的对象是有限的,确定的,如果是公有的就违背了这一原则
(3)提供当前枚举类的多个对象:public static final

class Season{
    //1、 声明Season对象的属性:private final 修饰
    private final String seasonName;


    // 2、 构造器私有化  因为枚举类的对象是有限的,确定的,如果是公有的就违背了这一原则
    private  Season(String seasonName){
        this.seasonName=seasonName;
    }

    // 3、提供当前枚举类的多个对象:public static final
    public static final Season SPRING=new Season("春天");
    public static final Season SUMMER=new Season("夏天");
    public static final Season AUTUMN=new Season("秋天");
    public static final Season WINTER=new Season("冬天");

    public String getSeasonName() {
        return seasonName;
    }
    
    @Override
    public String toString() {
       return  seasonName;
    }
}
/**
 * 自定义枚举类
 */
public class SeasonTest {
    public static void main(String[] args) {
        Season spring =Season.SPRING;
        System.out.println(spring);
    }
}

运行结果 春天

3、使用enum枚举类

用关键字enum来进行定义枚举类

public enum Season {
    // 1、提供当前枚举类的对象,多个对象用,隔开,末尾用;
    SPRING("春天"),
    SUMMER("夏天"),
    AUTUMN("秋天"),
    WINTER("冬天");

    // 2、声明season对象的属性:private final修饰
    private final String seasonName;

    // 3、 构造器私有化  因为枚举类的对象是有限的,确定的,如果是公有的就违背了这一原则
     Season(String seasonName) {
        this.seasonName = seasonName;
    }

    public String getSeasonName() {
        return seasonName;
    }
}
public class Main {
    public static void main(String[] args) {
        // 执行结果为SPRING,而不是一个地址值,打印一个对象默认调用的是这个对象的toString,
        //说明它的tostring被重写了,说明它的父类不是Object
        System.out.println(Season.SPRING);

        // 执行结果是class java.lang.Enum 说明它的父类是Enum
        System.out.println(Season.class.getSuperclass());
    }
}

执行结果

java 中某个属性的状态status 一般用枚举吗 java状态码枚举_枚举类


从上面分析的来看,枚举的父类是Enum

4、 Enum的常用方法

(1)toString(): 返回当前枚举类 对象常量的名字
(2)values(): 返回枚举类型的对象数组。该方法可以很方便的遍历所有的枚举值。

Season[] values = Season.values();
        for (Season value : values) {
            System.out.println(value);
        }

打印结果:

java 中某个属性的状态status 一般用枚举吗 java状态码枚举_ide_02


(3)valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的名字。如不是,会有运行时异常:IllegalArgumentException。

eg:

Season mo = Season.valueOf("mo");

报错:

java 中某个属性的状态status 一般用枚举吗 java状态码枚举_System_03

Season winter=Season.valueOf("WINTER");
        System.out.println(winter);

输出结果:WINTER

5、枚举类实现接口

主要展示让枚举类的对象分别展示接口中的抽象方法

interface Info{
    void show();
}

public enum Season implements Info{
    // 1、提供当前枚举类的对象,多个对象用,隔开,末尾用;
    SPRING("春天"){
        @Override
        public void show() {
            System.out.println("春天在哪里");
        }
    },
    SUMMER("夏天"){
        @Override
        public void show() {
            System.out.println("夏天在哪里");
        }
    },
    AUTUMN("秋天"){
        @Override
        public void show() {
        }
    },
    WINTER("冬天"){
        @Override
        public void show() {
        }
    };