Java中的枚举类型——Enum

一、认识枚举

枚举是在JDK1.5后引入的,主要作用是将一组常量组织起来进行统一管理。

应用场景:错误状态码、消息类型、颜色划分……

自定义的枚举类都会默认继承于java.lang.Enum,因此自定义的枚举类就可以使用Enum类中的方法:

Enum中的常用方法
方法名称作用
values()以数组的形式返回枚举类型中的所有成员
ordinal()获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员的定义顺序

注意:values()方法比较特殊,代码在编译后才会自动生成这个方法,所以我们在编写代码时是看不到这个方法的源码的。

二、枚举的使用

我们先自定义一个简单的枚举类:

public enum TestEnum {
    RED,GREEN,BLUE,YELLOW;
}

1、switch语句的判定

枚举对象可以用于switch语句的判定条件:

public static void main(String[] args) {
    TestEnum test = TestEnum.RED;
    switch (test){
        case RED:
            System.out.println("red");
            break;
        case GREEN:
            System.out.println("green");
            break;
        case BLUE:
            System.out.println("blue");
            break;
        case YELLOW:
            System.out.println("yellow");
            break;
        default:
            break;
    }
}

代码运行结果:

2、values()方法和ordinal()方法的使用

    public static void main(String[] args) {
        //将自定义枚举类型中的所有对象以数组的形式返回
        TestEnum[] testEnums = TestEnum.values();

        for (int i = 0; i < testEnums.length; i++) {
            //输出每个对象及其对应的序号
            System.out.println(testEnums[i]+"序号:"+testEnums[i].ordinal());
        }
    }

代码运行结果:

3、valueOf()方法的使用

public static void main(String[] args) {
    //输入的字符串必须是上面的实例之一
    System.out.println(TestEnum.valueOf("RED"));
    System.out.println(TestEnum.valueOf("GREEN"));
    //否则会抛出IllegalArgumentException异常
    System.out.println(TestEnum.valueOf("BLACK"));
}

代码运行结果: 

4、compareTo方法的使用

public static void main(String[] args) {
    System.out.println(RED.compareTo(GREEN));
    System.out.println(BLUE.compareTo(YELLOW));
    System.out.println(YELLOW.compareTo(RED));
}

代码运行结果: 

5、枚举类的构造方法

枚举类中的构造方法默认是一个无参的构造方法,我们也可以自定义构造方法:

public enum TestEnum {
    RED("RED",1),GREEN("GREEN",2),
    BLUE("BLUE",3),YELLOW("YELLOW",4);

    public String color;
    public int ordinal;

    private TestEnum(String color,int ordinal){
        this.color = color;
        this.ordinal = ordinal;
    }
}

枚举类型的构造方法默认是被private修饰的,如果改为其它的访问权限会报错。

三、枚举和反射

既然枚举类型的构造方法默认是被private修饰的,那么能否通过反射的方式来实例化一个枚举对象呢? 

public static void main(String[] args) {

    //获取TestEnum的Class对象
    Class<?> c = TestEnum.class;

    try {
        //还需要给父类Enum的构造方法进行传参
        Constructor<?> constructor = 
        c.getDeclaredConstructor(String.class,int.class,String.class,int.class);

        //设置为true后可以修改访问权限
        constructor.setAccessible(true);

        //父类参数不给也可以,默认为空
        TestEnum testEnum = 
        (TestEnum) constructor.newInstance("WHITE",5,"父类的参数",999);

        System.out.println(testEnum);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

注意:

自定义的枚举类型默认继承于标准库里的Enum类,Enum中只有一个构造方法:

我们在构造子类对象之前需要先帮助父类构造,所以调用getDeclaredConstructor方法时需要给4个参数,2个是自定义枚举类TestEnum构造方法的参数类型,2个是父类Enum构造方法的参数类型。

代码运行结果:

抛出IllegalArgumentException异常,并提示说:Cannot reflectively create enum objects,不能反射式创建enum对象

Java枚举类型enum用于定义一组有限的常量。在Java 1.5之前,常量通常是使用public static final修饰的变量来定义的。而使用枚举类型可以更好地组织相关联的常量,并提供更多的方法操作。枚举类型的声明格式为:enum EnumName {ENUM_VALUE1, ENUM_VALUE2, ...}。其ENUM_VALUE1、ENUM_VALUE2等是枚举类型的常量。 枚举类型Java有很多应用场景。例如,可以使用枚举类型来表示一周的星期几,定义颜色常量,定义状态等。通过使用枚举类型,可以增加代码的可读性和安全性。 此外,Java提供了一些与枚举类型相关的集合类,如EnumSet和EnumMap。EnumSet保证集合的元素不重复,而EnumMap的key是enum类型,而value可以是任意类型。这些集合类能够更方便地对枚举类型进行操作。 关于枚举类型的更多使用方法和规范,可以参考Java官方文档或阿里巴巴Java开发手册。123 #### 引用[.reference_title] - *1* *2* [Java枚举(enum)常用的用法总结](https://blog.csdn.net/qq_44866828/article/details/117380065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [Java 枚举(enum) 的常见用法和开发规范](https://blog.csdn.net/dichengyan0013/article/details/102347137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吃点橘子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值