【Java】枚举(enum)机制 详解

您所在的位置:网站首页 java枚举构造方法 【Java】枚举(enum)机制 详解

【Java】枚举(enum)机制 详解

2024-03-16 11:28| 来源: 网络整理| 查看: 265

目录 1 背景及定义2 使用3 枚举优点和缺点4 枚举和反射5 重点

1 背景及定义

枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式:

public static int final RED = 1; public static int final GREEN = 2; public static int final BLACK = 3;

但是常量举例有不好的地方,例如:可能碰巧有个数字1,但是他有可能误会为是RED,现在我们可以直接用枚举来进行组织,这样一来,就拥有了类型,枚举类型。而不是普通的整形1.

public enum TestEnum { RED,BLACK,GREEN; }

优点:将常量组织起来统一进行管理 场景:错误状态码,消息类型,颜色的划分,状态机等等…

本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认(隐式)继承了这个类。

2 使用

重要:枚举的构造方法默认是私有的

public enum TestEnum { RED("red",1),BLACK("black",2),GREEN("green",3); public String color; public int ordinal; //1、当枚举对象有参数后,需要提供相应的构造函数 // 2、枚举的构造函数默认是私有的 这个一定要记住 private TestEnum(String color,int ordinal){ this.color=color; this.ordinal=ordinal; } switch语句 也就是通过TestEnum类来.BLACK,此时testEnum对象就代表了枚举常量BLACK 执行switch语句也就是执行了:case BLACK: System.out.println("black"); break; public static void main1(String[] args) { TestEnum testEnum=TestEnum.BLACK; switch (testEnum) { case RED: System.out.println("red"); break; case BLACK: System.out.println("black"); break; case GREEN: System.out.println("GREEN"); break; default: break; } } 常用方法 Enum 类的常用方法: 在这里插入图片描述 示列: public static void main(String[] args) { //把字符串 变成对应的枚举对象 TestEnum testEnum=TestEnum.valueOf("RED"); System.out.println(testEnum); //比较两个枚举成员在定义时的顺序 System.out.println(RED.compareTo(GREEN)); System.out.println(BLACK.compareTo(RED)); }

输出如下: red在green前两个定义,所以放回-2 black在red后一个定义,所以返回+1 在这里插入图片描述

在这里插入图片描述

public static void main(String[] args) { //以数组形式返回枚举类型的所有成员 TestEnum[] testEnums=TestEnum.values(); for (int i = 0; i this.name = name; this.ordinal = ordinal; }

也就是说,我们自己的构造函数有两个参数一个是String一个是int,同时他默认后边还会给两个参数,一个是String一个是int。也就是说,这里我们正确给的是4个参数:

constructor = classEnum.getDeclaredConstructor(String.class,int.class,String.class,int.class); package enumdemo; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class TestEnumReflect { public static void reflectPrivateConstructor(){ try { Class classEnum=Class.forName("enumdemo.TestEnum"); Constructor constructor= null; try { //注意传入对应的参数,获得对应的构造方法来构造对象,当前枚举类是提供了两个参数分别是String和 int. //注意传入参数不仅要传入自己构造的函数的参数,也需要传入源码枚举类的构造函数,参数也是string和int. //注意传参需要 参数.class constructor = classEnum.getDeclaredConstructor(String.class,int.class,String.class,int.class); } catch (NoSuchMethodException e) { //使用idea快捷键alt+enter来处理相应异常 e.printStackTrace(); } //设置为true后可修改访问权限 constructor.setAccessible(true); try { Object obj=constructor.newInstance("gerrn",666,"bit",99); TestEnum testEnum=(TestEnum) obj; System.out.println("获取枚举的构造函数"+testEnum); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { reflectPrivateConstructor(); } }

输出结果: 在这里插入图片描述 此时的异常信息显示,是这个方法:newInstance() 报错了!

关于为什么会抛出 java.lang.IllegalArgumentException:异常,此时我们溯源到源码: 在这里插入图片描述 枚举在这里被过滤了,不能通过反射获取枚举类的实例!

5 重点 枚举本身就是一个类,其构造方法默认为私有的,且都是默认继承与 java.lang.Enum枚举可以避免反射和序列化问题枚举的优点: 枚举常量更简单安全 。枚举具有内置方法 ,代码更优雅

缺点:

不可继承,无法扩展

over



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3