文章来源: 我的微信公众号:程序员老左,欢迎关注和留言,后面会定期更新
什么是枚举?
枚举是Java 5引入的一种特殊数据类型,用于定义一组固定的常量,在结构上和类很相似。枚举类型可以帮助我们组织和管理相关的常量,使得代码更加清晰、可读性更强。例如表示一周的天数、表示颜色、表示状态等等。
定义枚举
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
使用枚举
Day day = Day.MONDAY;
通过枚举名称直接引用相关的常量,有点像类的静态属性。
常用用法是配合switch使用
Day day = Day.MONDAY;
switch (day){
case MONDAY:
System.out.println("星期一");
break;
case TUESDAY:
System.out.println("星期二");
break;
}
枚举比较
Day day = Day.MONDAY;
if(day == Day.MONDAY){
System.out.println(true);
}else{
System.out.println(false);
}
输出:
true
枚举中定义的常量到底是啥?
枚举和类可以说非常相似,或者也可以称为具有特定限制的类。它的每一个常量都是一个对象(实例),都是一个事先创建好的对象。MONDAY是对象,TUESDAY也是对象,其余的都是对象。当使用Day.MONDAY时,实际上是引用MONDAY对象。
这也就是为什么枚举常量可以通过==来判断是否相等
Day day = Day.MONDAY;
Day day2 = Day.MONDAY;
if(day == day2){
System.out.println(true);
}else{
System.out.println(false);
}
输出:
true
因为day和day2引用的是同一个对象
构造方法
既然可以实例化对象,那么就应该有构造对象的构造方法,如果不定义构造方法,默认情况下,会使用默认的无参的构造方法:
private Day(){
}
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
private Day(){
System.out.println("实例化:"+this);
}
}
注意SUNDAY后面要加";",而且构造方法必须是private,因为不允许我们自己创建对象。
当程序中没有用到该枚举时,不会为常量创建枚举对象,一旦用到就自动创建对象:
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
比如,如下程序:
public static void main(String[] args) {
Day day = Day.MONDAY;
}
当运行到Day.MONDAY时,会触发构造方法,为每一个枚举常量都创建对象,输出:
实例化:MONDAY
实例化:TUESDAY
实例化:WEDNESDAY
实例化:THURSDAY
实例化:FRIDAY
实例化:SATURDAY
实例化:SUNDAY
枚举属性
可以创建对象,理论上也可以让对象存在属性。比如给枚举加一个
description属性
public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
private Day(){
System.out.println("实例化:"+this);
}
public String description = null;
}
修改MONDAY常量对象的属性:
Day.MONDAY.description = "星期一";
System.out.println(Day.MONDAY.description);
输出:星期一
此时,其他常量
(TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY)的description属性仍为null。
枚举方法
同样,也可以创建方法:
public void setDescription(String description){
this.description = description;
}
使用枚举方法:
修改MONDAY对象的description属性
Day.MONDAY.setDescription("星期一");
带参数的构造方法
由于有属性的存在,往往需要通过构造方法给属性赋值,那么就需要定义带参的构造方法:
private Day(String s){
this.description = s;
}
此时,枚举常量就可以通过构造方法给description属性赋值:
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
从这里可以看出,枚举常量实际上相当于Day类的:
public static Day MONDAY = new Day("星期一");
重写方法
每一个枚举常量都可以重写枚举已经定义的方法:
MONDAY("星期一"){
public void setDescription(String description){
this.description = "今天是:" + description;
}
}
枚举遍历
可以使用values()方法遍历枚举中的所有常量:
for (Day day : Day.values()) {
System.out.println(day);
}
输出:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
valueOf方法
valueOf(String name):根据名称返回对应的枚举常量。
Day day = Day.valueOf("MONDAY");