【Java】枚举(enum)机制 详解 |
您所在的位置:网站首页 › java枚举构造方法 › 【Java】枚举(enum)机制 详解 |
目录
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 类的常用方法:![]() 输出如下: red在green前两个定义,所以放回-2 black在red后一个定义,所以返回+1 也就是说,我们自己的构造函数有两个参数一个是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(); } }输出结果: 关于为什么会抛出 java.lang.IllegalArgumentException:异常,此时我们溯源到源码: 缺点: 不可继承,无法扩展 over |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |