- 单例模式:枚举类型是一种有限实例的类,枚举常量在定义时就被限定为一组固定的实例,不能动态添加或修改。每个枚举常量都是枚举类型的实例,因此枚举类型天然地支持单例模式。
- 类型安全:枚举类型是类型安全的,编译器会在编译时检查枚举值的合法性,避免使用无效的枚举常量,在多线程环境下使用枚举类型是线程安全的。
- 不可继承:枚举类型默认是final修饰的,不能被继承,因为枚举类型已经提供了固定的实例集合。
- 可添加属性和方法:枚举类型可以拥有字段、方法和构造函数,可以为每个枚举常量添加属性和行为。
一、定义方式
java枚举是一种特殊的数据类型,用于定义一组常量集合,可以定义简单的枚举常量,也可以为枚举常量添加属性和方法。
1.1 简单定义
// 定义表示星期的枚举类型
public enum weekday {
monday, // 星期一
tuesday, // 星期二
wednesday, // 星期三
thursday, // 星期四
friday, // 星期五
saturday, // 星期六
sunday // 星期日
}1.2 带参数定义
带参数定义允许枚举常量携带额外信息,使枚举更具灵活性。
// 定义表示季节的枚举类型,每个季节携带中文名称
public enum season {
spring(1,"春天"),
summer(2,"夏天"),
autumn(3,"秋天"),
winter(4,"冬天");
private integer index;
private string chinesename;
public integer getindex() {return index;}
public string getchinesename() {
return chinesename;
}
}枚举类型可以通过values()方法获取所有枚举常量的数组,方便遍历枚举值。
public static string getbycode(integer index){
for(season season : values()){
if (season.getindex() == index) {
return getindex.getchinesename();
}
}
return null;
}二、反射应用
1. 反射获取枚举常量
public class enumreflectionexample {
enum day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
public static void main(string[] args) {
// 获取枚举类对象
class<day> enumclass = day.class;
// 获取枚举常量
day[] days = enumclass.getenumconstants();
for (day day : days) {
system.out.println(day);
}
}
}2. 反射获取枚举属性
public class enumreflectionexample {
enum day {
monday("星期一"), tuesday("星期二"), wednesday("星期三"), thursday("星期四"), friday("星期五"), saturday("星期六"), sunday("星期日");
private string chinesename;
day(string chinesename) {
this.chinesename = chinesename;
}
public string getchinesename() {
return chinesename;
}
}
public static void main(string[] args) {
// 获取枚举类对象
class<day> enumclass = day.class;
// 获取枚举属性
try {
field chinesenamefield = enumclass.getdeclaredfield("chinesename");
chinesenamefield.setaccessible(true);
for (day day : day.values()) {
string chinesename = (string) chinesenamefield.get(day);
system.out.println(day + " 的中文名是:" + chinesename);
}
} catch (nosuchfieldexception | illegalaccessexception e) {
e.printstacktrace();
}
}
}3. 动态调用枚举方法
public class enumreflectionexample {
enum day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday;
public void sayhello() {
system.out.println("今天是:" + this);
}
}
public static void main(string[] args) {
// 动态调用枚举方法
try {
day monday = day.valueof("monday");
monday.sayhello();
} catch (illegalargumentexception e) {
e.printstacktrace();
}
}
}4. 动态设置枚举属性
public class enumreflectionexample {
enum day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday;
private string description;
public string getdescription() {
return description;
}
public void setdescription(string description) {
this.description = description;
}
}
public static void main(string[] args) {
// 动态设置枚举属性
day monday = day.monday;
monday.setdescription("星期一");
system.out.println(monday.getdescription());
}
}5. 判断枚举类型
public class enumreflectionexample {
enum day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
public static void main(string[] args) {
// 枚举类型判断
class<?> enumclass = day.class;
if (enumclass.isenum()) {
system.out.println("这是一个枚举类型");
} else {
system.out.println("这不是一个枚举类型");
}
}
}6. 反射获取枚举信息
public class enumreflectionexample {
enum day {
monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
public static void main(string[] args) {
// 枚举信息获取
class<day> enumclass = day.class;
system.out.println("枚举类的简单名称:" + enumclass.getsimplename());
system.out.println("枚举类的全限定名称:" + enumclass.getname());
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论