枚举类
一、说明
- 枚举类的理解:类的对象是确定的、有限个,我们称这样的类为枚举类。如:一个季节类有春夏秋冬四个明确地对象。
- 当需要定义一组常量时,通常通过创建枚举类的方式。
- 如果枚举类只有一个对象,则可以作为单例模式的实现方式。
二、创建方式
创建枚举类的方式有两种,一种是自定义枚举类,适用于jdk5.0之前,(了解即可,如今的使用场景不多),另一种是jdk5.0新增的,使用enum来定义枚举类。
1.方式一:自定义枚举类
代码示例
public class Season {
//1.声明Season对象的属性,用private final修饰
private final String seasonName;
private final String seasonDescription;
//2.私有化类的构造器,并给对象属性赋值
private Season(String seasonName, String seasonDescription){
this.seasonName = seasonName;
this.seasonDescription = seasonDescription;
}
//3.提供当前枚举类的多个对象,使用public static final来修饰
public static final Season SPRING = new Season("春天","春暖花开");
public static final Season SUMMER = new Season("夏天","夏日炎炎");
public static final Season AUTUMN = new Season("秋天","秋高气爽");
public static final Season WINTER = new Season("冬天","寒冬凛冽");
//4.1其他诉求:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDescription() {
return seasonDescription;
}
//4.2其他诉求:提供toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDescription='" + seasonDescription + '\'' +
'}';
}
}
2.方式二:使用enum
定义的枚举类默认继承于java.lang.Enum
- 提供当前枚举类的对象,多个对象之间用“,”隔开,末尾对象以“;”结束
- 声明对象的属性,用private final 修饰
- 私有化类的构造器,并给对象赋值
- 补充:根据需求决定是否需要重写toString() 方法,未重写的情况下默认打印常量名(对象名)。
代码示例
public enum Season1 {
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","寒冬凛冽");
private final String seasonName;
private final String seasonDescription;
Season1(String seasonName, String seasonDescription) {
this.seasonName = seasonName;
this.seasonDescription = seasonDescription;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDescription() {
return seasonDescription;
}
}
三、Enum类的主要方法
- values():返回枚举类型的对象数组,用于遍历所有的枚举值。
示例代码
Season1[] season1s = Season1.values();
for (int i = 0; i < season1s.length; i++) {
System.out.print(season1s[i]+ " | ");
}//SPRING | SUMMER | AUTUMN | WINTER
- valueOf(String objectName): 返回枚举类中对象名是objectName的对象(大小写需完全一致),若未找到相对应的枚举类对象则抛出异常:IllegalArgumentException。
示例代码
Season1 winter1 = Season1.valueOf("WINTER");
System.out.println(winter1);//WINTER
- toString():返回当前枚举类对象常量的名称。
代码示例
Season1 autumn1 = Season1.AUTUMN;
System.out.println(autumn1.toString());//AUTNMN
//此处toString()为多余部分,为了直观展示
四、使用enum关键字定义的枚举类实现接口
1.情况一
在enum类中实现抽象方法
代码示例
interface Info{
void show();
}
public enum Season1 implements Info {
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
private final String seasonName;
private final String seasonDescription;
Season1(String seasonName, String seasonDescription) {
this.seasonName = seasonName;
this.seasonDescription = seasonDescription;
}
@Override
public void show() {
System.out.println("这是一个季节");
}
}
2.方式二
让枚举类的对象分别实现接口中的抽象方法
代码示例
interface Info {
void show();
}
public enum Season1 implements Info {
SPRING("春天", "春暖花开") {
@Override
public void show() {
System.out.println("这是春天!");
}
},
SUMMER("夏天", "夏日炎炎") {
@Override
public void show() {
System.out.println("这是夏天!");
}
},
AUTUMN("秋天", "秋高气爽") {
@Override
public void show() {
System.out.println("这是秋天!");
}
},
WINTER("冬天", "冰天雪地") {
@Override
public void show() {
System.out.println("这是冬天!");
}
};
private final String seasonName;
private final String seasonDescription;
Season1(String seasonName, String seasonDescription) {
this.seasonName = seasonName;
this.seasonDescription = seasonDescription;
}
}