文章目录
- 枚举的使用
- switch语句
- Enum类的常用方法
- 枚举的构造方法
- 反射与枚举
在之前的学习中,如果我们需要组织一组枚举类型的数据,我们通常会使用常量来进行定义。但这种定义方式存在一个问题就是:如果在一个程序中,普通常量和使用该常量定义的枚举类型同时出现,就极有可能会产生混淆。因此为了避免这种情况的出现,在JDK1.5之后,java就引入了枚举类型Enum。
枚举是java.lang.Enum的子类,自己写的枚举类,即使没有显式地继承Enum,也依然默认继承了该类;
枚举的使用
switch语句
public enum EnumTest {
//定义枚举常量
RED,ORANGE,YELLOW,BLUE,GREEN;
public static void main(String[] args) {
EnumTest enumTest=EnumTest.BLUE;
//switch语句的的变量可以是枚举类型
switch (enumTest){
case RED:
System.out.println("红色");
case ORANGE:
System.out.println("橙色");
case YELLOW:
System.out.println("黄色");
case BLUE:
System.out.println("蓝色");
case GREEN:
System.out.println("绿色");
}
}
}
Enum类的常用方法
使用代码演示具体的使用方法:
/**
* Created with IntelliJ IDEA.
* Description:
* User: 晨曦
* Date: 2023-05-14
* Time: 16:01
*/
public enum EnumTest {
//定义枚举常量
RED,ORANGE,YELLOW,BLUE,GREEN;
public static void main(String[] args) {
//values()以数组形式返回枚举类型的所有成员
EnumTest [] tests=EnumTest.values();
for (int i=0;i<tests.length;i++){
//ordinal()获取枚举成员的索引位置
System.out.println(tests[i].ordinal()+": "+tests[i]);
}
//valueOf()将括号中的字符串转换为枚举类型
//getClass()获取变量的类型
System.out.println(EnumTest.valueOf("BLUE").getClass().toString());
}
}
/**
* Created with IntelliJ IDEA.
* Description:
* User: 晨曦
* Date: 2023-05-14
* Time: 16:01
*/
public enum EnumTest {
//定义枚举常量
RED,ORANGE,YELLOW,BLUE,GREEN;
public static void main(String[] args) {
//使用变量获取枚举实例
EnumTest test =EnumTest.RED;
EnumTest test1=EnumTest.YELLOW;
//compareTo()比较两个枚举成员在定义时的顺序
System.out.println(test.compareTo(test1));
System.out.println(ORANGE.compareTo(GREEN));
}
}
枚举的构造方法
枚举的构造方法是私有的;
public enum EnumTest2 {
//定义枚举常量
RED("红色",1),ORANGE("橙色",2),YELLOW("黄色",3),BLUE("蓝色",4),GREEN("绿色",5);
private String name;
private int id;
private EnumTest2(String name, int id) {
this.name = name;
this.id = id;
}
}
枚举的构造方法不允许是public类型;
反射与枚举
进行反射的大致流程是:首先创建对象,再通过合适的方法达到反射的目的;
具体使用代码进行演示:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 晨曦
* Date: 2023-05-14
* Time: 17:08
*/
public enum EnumTest2 {
//定义枚举常量
RED("红色",1),ORANGE("橙色",2),YELLOW("黄色",3),BLUE("蓝色",4),GREEN("绿色",5);
private String name;
private int id;
private EnumTest2(String name, int id) {
this.name = name;
this.id = id;
}
public static void reflectPrivate(){
try {
//获取类对象
Class<?> c=Class.forName("EnumTest2");
//获取与参数类型匹配的构造方法
Constructor<?> constructor=c.getDeclaredConstructor(String.class,int.class);
//修改访问权限
constructor.setAccessible(true);
//创建对应的实例
EnumTest2 test=(EnumTest2) constructor.newInstance("蓝色",69);
System.out.println(test);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
reflectPrivate();
}
}
在上面基础代码无误的情况下,得到的运行结果是这样的:
出现了NoSuchMethodException的错误,根据idea提示的错误位置,定位到了getDeclaredConstructor()方法处,但该方法在之前的反射程序中却是没有问题的。是在获取枚举的构造方法时出现了问题,为了找到问题所在,我们查看Enum类的源码;
可以看到,Enum类的构造方法有着2个默认的参数,一个String类型的和一个int类型的;该构造方法是供编译器在响应枚举类型时自主调用,也就是说,如果我们自己的构造函数已经有2个参数,那么我们在写反射代码时就需要提供4个参数(自己的2个参数+默认的2个参数);
然而结果依然报错,定位到newInstance()方法,查看源码:
代码显示,newInstance()方法不支持枚举类;
所以,java不支持通过反射获取枚举类的实例
over!