首先,我们需要知道枚举是JDK5的新特性,是引用类,也是一种特殊的类。
jdk5以前是使用常量类
public class DayDemo {
public static final int MONDAY =1;
public static final int TUESDAY=2;
public static final int WEDNESDAY=3;
public static final int THURSDAY=4;
public static final int FRIDAY=5;
public static final int SATURDAY=6;
public static final int SUNDAY=7;
}
jdk5后使用枚举
基本定义
使用关键字enum(类似class)来定义枚举
enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
上面定义了周一到周日的值,用大写逗号隔开-------枚举中定义的是常量
使用
直接通过枚举类引用
Day day =Day.MONDAY;
枚举原理
在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的抽象类Day,这个类继承了Java API中的java.lang.Enum类,还帮助我们生成了7个Day类型的实例对象分别对应枚举中定义的7个日期,还为我们生成了两个静态方法,分别是values()和 valueOf()。
总结:使用关键字enum定义的枚举类型,在编译期后,也将转换成为一个实实在在的类,而在该类中,会存在每个在枚举类型中定义好常量的对应实例对象
values()和 valueOf()
values()和 valueOf()其实是java.lang.Enum类的。
如何使用呢?
Day[] days2 = Day.values();
System.out.println("day2:"+Arrays.toString(days2));
Day day = Day.valueOf("MONDAY");
System.out.println("day:"+day);
day2:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]
day:MONDAY
实际开发中的定义以及使用
属性,属性对应的常量值,私有有参构造(无无参构造),只有getter方法。
public enum Day2 {
// 前面是文字描述,后面是代码
MONDAY("星期一",1),
TUESDAY("星期二",2),
WEDNESDAY("星期三",3),
THURSDAY("星期四",4),
FRIDAY("星期五",5),
SATURDAY("星期六",6),
SUNDAY("星期日",7);//记住要用分号结束
private String desc;//文字描述
private Integer code; //对应的代码
/**
* 私有构造,防止被外部调用,枚举没有无参构造
* @param desc
*/
private Day2(String desc,Integer code){
this.desc=desc;
this.code=code;
}
/**
* 定义方法,返回描述,跟常规类的定义没区别
* 枚举只有getter方法,setter方法没有,定义的时候就赋值好了
* @return
*/
public String getDesc(){
return desc;
}
/**
* 定义方法,返回代码,跟常规类的定义没区别
* @return
*/
public int getCode(){
return code;
}
// 测试使用,上面就是完成的定义枚举
public static void main(String[] args){
for (Day2 day:Day2.values()) {
System.out.println("name:"+day.name()+
",desc:"+day.getDesc());
}
}