6、枚举类
6.1 枚举类的引入
- 枚举类:类的对象只有有限个,确定的。
- 当需要定义一组常量时,建议使用枚举类(如季节:春夏秋冬;星期:1~7;性别:男女)
- 如果枚举类中只有一个对象,则可以作为单例模式的实现方式
6.2 定义枚举类
方式一:JDK5.0 之前,自定义枚举类
- 声明枚举类对象的属性:paivate final修饰
- 私有化类的构造器,并给对象属性赋值
- 提供当前枚举类的多个对象:public static final修饰
- 其他:提供get方法获取枚举类对象的属性、提供toString()方法
//自定义枚举类
class Season{
// 1.声明Season对象的属性:paivate final修饰
private final String seasonName;
private final String seasonDesc;
// 2.私有化类的构造器,并给对象属性赋值
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 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:提供get方法获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// 4.其他2:提供toString()方法
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
方式二:JDK5.0之后,增加enum关键字
enum默认继承于java.lang.Enum类
- 提供多个当前枚举类的对象,多个对象间用“,”隔开,末尾对象以“;”结束
- 声明枚举类对象的属性:paivate final修饰
- 私有化类的构造器,并给对象属性赋值
- 其他:提供get方法获取枚举类对象的属性
enum Season1{
// 1.提供多个当前枚举类的对象,多个对象间用“,”隔开,末尾对象以“;”结束
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
// 2.声明枚举类对象的属性:paivate final修饰
private final String seasonName;
private final String seasonDesc;
// 3.私有化类的构造器,并给对象属性赋值
private Season1(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4.其他:提供get方法获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
6.3 Enum类常用方法
- toString():返回当前枚举类对象常量的名称
System.out.println(Season1.SPRING);
//SPRING
-
values():返回枚举类型的对象数组,便于遍历所有枚举值
System.out.println(Arrays.toString(Season1.values())); //[SPRING, SUMMER, AUTUMN, WINTER]
-
valueOf(String str):返回枚举类中对象名是str的枚举类对象
若枚举类中没有该对象,则会抛出异常:IllegalArgumentException
Season1 s = Season1.valueOf("WINTER"); System.out.println(s); //WINTER
6.4 enum实现接口
情况一:实现接口,在enum类中实现抽象方法(不同枚举对象功能统一)
情况二:实现接口,让枚举类对象分别实现接口中的抽象方法(不同枚举对象实现各自的功能)
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("大约在冬季");
}
};
练习:
enum Status{
FREE("FREE"),
BUSY("BUSY"),
VOCATION("VOCATION");
private final String name;
private Status(String name){
this.name = name;
}
}
//等同于👇
enum Status1{
FREE,BUSY,VOCATION;
}
我的学习笔记有更多精彩内容哦
Java编程知识专栏