枚举类的使用

1. 枚举的概述


枚举和Java类一样,也是一种引用数据类型,是jdk5.0中引入的一个新特性,其用于定义一组取值范围比较固定的数据。

例如,可以通过枚举将这些固定数据作为枚举常量来表示:

  • 季节:春夏秋冬
  • 星期:星期一到星期日
  • 月份:一月到十二月
  • 支付方式:微信、支付宝、银行卡
  • 订单状态:未付款、已付款、已配货、已发货、、退款、已确认
  • 线程状态:创建、就绪、运行、阻塞、死亡
  • 方向:上下左右
  • 颜色:红黄蓝绿

使用枚举的好处:可以提高代码的可读性,增加数据的安全性。

在Java中,所有的枚举类默认继承自java.lang.Enum类,由于Java是单继承的,所以枚举类无法再继承其他类。

如果枚举中只有一个实例,无法通过反射或序列化创建其他实例。


2. Enum类的常用方法


image-20230820214935450


3. 枚举的定义和使用


3.1 在jdk5.0之前,自定义枚举类
package cn.z3inc.constant;

public class ColorTest {
    public static void main(String[] args) {
        Color blue = Color.BLUE;  // 获取枚举类对象
        System.out.println(blue); //Color{colorName='蓝色', colorDesc='蓝色的小车'}
        System.out.println("colorName:"+blue.getColorName());//colorName:蓝色
        System.out.println("colorDesc:"+blue.getColorDesc());//colorDesc:蓝色的小车
    }
}

// 自定义枚举类
class Color {

    // 1.声明Color对象的属性: private final修饰
    private final String colorName;
    private final String colorDesc;

    // 2.构造器私有化,并给对象属性赋值
    private Color(String colorName, String colorDesc) {
        this.colorName = colorName;
        this.colorDesc = colorDesc;
    }

    // 3.为当前枚举类提供多个对象(常量): public static final修饰
    public static final Color RED = new Color("红色", "红色的小车");
    public static final Color GREEN = new Color("绿色", "绿色的小车");
    public static final Color BLUE = new Color("蓝色", "蓝色的小车");


    // 4.提供getter方法
    public String getColorName() {
        return colorName;
    }

    public String getColorDesc() {
        return colorDesc;
    }

    // 5.重写toString方法
    @Override
    public String toString() {
        return "Color{" +
                "colorName='" + colorName + '\'' +
                ", colorDesc='" + colorDesc + '\'' +
                '}';
    }
}

运行结果:

image-20230820210009708


3.2 在jdk5.0之后,使用enum关键字定义枚举类

(1)枚举类有多个字段的情况:

package cn.z3inc.constant;

public class SeasonTest {
    public static void main(String[] args) {
        /*
            说明: 定义的枚举类默认继承于java.lang.Enum类
                 如果不提供toString方法,则调用父类Enum的toString方法,输出的是枚举类对象的名字
         */
        Season summer = Season.SUMMER;
        System.out.println(summer); // 如果不提供toString方法,默认输出的是枚举类对象的名字: SUMMER
        System.out.println(Season.class.getSuperclass()); // class java.lang.Enum
        test(summer); // 夏日炎炎
    }

    // 测试方法
    public static void test(Season season) {
        // jdk5.0之前,switch语句只能支持byte、short、char、int四种基本数据类型,以及枚举类型
        // jdk7.0之后,switch语句还可以支持String类型
        switch (season) {
            case AUTUMN:
                System.out.println(Season.AUTUMN.getDesc());
                break;
            case SPRING:
                System.out.println(Season.SPRING.getDesc());
                break;
            case SUMMER:
                System.out.println(Season.SUMMER.getDesc());
                break;
            case WINTER:
                System.out.println(Season.WINTER.getDesc());
                break;

        }
    }

    // 使用enum关键字定义枚举类
    enum Season {
        // 1. 提供当前枚举类的对象,多个对象之间用逗号隔开,末尾对象用分号结束
        SPRING("春天", "春暖花开"),
        SUMMER("夏天", "夏日炎炎"),
        AUTUMN("秋天", "秋高气爽"),
        WINTER("冬天", "冬虫夏草");

        // 2. 声明Season对象的属性: private final修饰
        private final String name; // 季节名称
        private final String desc; // 季节描述

        // 3. 构造器私有化,并给对象属性赋值: private可以省略
        private Season(String name, String desc) {
            this.name = name;
            this.desc = desc;
        }

        // 4. 提供getter方法
        public String getName() {
            return name;
        }

        public String getDesc() {
            return desc;
        }

        // 5. 根据季节描述获取枚举对象(枚举值)
        public static Season getSeason(String desc) {
            Season[] values = Season.values();
            for (Season value : values) {
                if (desc.equals(value.getDesc())) {
                    return value;
                }
            }
            return null;
        }
    }
}

运行结果:

image-20230820213800311

通过反编译查看源码:javap Season.class

image-20230820212700704


(2)枚举类没有字段的情况:

public class AnimalTest {
    public static void main(String[] args) {
        Animal cat = Animal.CAT;
        System.out.println(cat); // CAT
        Animal pig = Animal.PIG;
        System.out.println(pig); // PIG
    }
}

enum Animal{
    // 枚举类的实例对象(枚举值)
    CAT,DOG,PIG,DUCK;
}

4. 使用枚举替代魔法值


存在魔法值的场景:

class Demo1 {
    public static void main(String[] args) {
        int userType = 1;
        if (userType == 1) {
            System.out.println("管理员用户");
        } else if (userType == 2) {
            System.out.println("普通用户");
        } else {
            System.out.println("未知用户类型");
        }
    }
}

将常量值抽取到枚举类中使用:

public class Demo1 {
    public static void main(String[] args) {
        int userType = 1;
        if (userType == UserType.ADMIN.getCode()) {
            System.out.println(UserType.ADMIN.getDesc());
        } else if (userType == UserType.NORMAL.getCode()) {
            System.out.println(UserType.NORMAL.getDesc());
        } else {
            System.out.println(UserType.UNKNOWN.getDesc());
        }
    }
}
enum UserType {
    // 枚举对象(枚举值)
    ADMIN(1, "管理员用户"),
    NORMAL(2, "普通用户"),
    UNKNOWN(3, "未知用户类型");

    // 成员变量
    private int code;
    private String desc;

    // 构造方法
    UserType(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // 根据code获取枚举值
    public static UserType of(int code) {
        for (UserType userType : UserType.values()) {
            if (userType.code == code) {
                return userType;
            }
        }
        return UNKNOWN;
    }

    public int getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}

运行结果:

image-20230820224859898

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白豆五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值