概念
枚举类,顾名思义即类的对象只有确定的有限个。比如:
-
星期:周一、 ... 、周日
-
性别:男、女
-
季节:春、夏、秋、冬
-
线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMEED_WAITING、TERMINATED
枚举类的实现
-
jdk1.5之前需要自定义枚举类
-
jdk1.5新增的enum关键字用于定义枚举类
枚举类的属性
-
枚举类的属性应不允许被改动,所以应使用private final修饰
-
枚举类的使用private final 修饰的属性应在构造方法中进行赋值
-
若枚举类显式的定义了带参数的构造方法,则在列出枚举值时也必须传入对应的参数
自定义枚举类
/**
* 自定义枚举类
*/
class DateType {
//1、声明自定义枚举类对象的属性,要用private final修饰
private final String date;
private final String description;
//2、私有化构造方法,并给属性赋值
private DateType(String date, String description) {
this.date = date;
this.description = description;
}
//3、提供当前枚举类 用static final修饰(可通过类名直接调用且不可变)
public static final DateType YESTERDAY = new DateType("昨天", "悟已往之不谏");
public static final DateType TODAY = new DateType("今天", "珍惜当下");
public static final DateType TOMORROW = new DateType("明天", "知来者之可追");
//4、其他诉求:比如get()方法、toString()方法
public String getDate() {
return date;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return "DateType{" +
"date='" + date + '\'' +
", description='" + description + '\'' +
'}';
}
}
测试代码
public class EnumTest {
public static void main(String[] args) {
DateType yesterday = DateType.YESTERDAY;
DateType today = DateType.TODAY;
DateType tomorrow = DateType.TOMORROW;
System.out.println(yesterday);
System.out.println(today);
System.out.println(tomorrow);
}
}
控制台输出
DateType{date='昨天', description='悟已往之不谏'}
DateType{date='今天', description='珍惜当下'}
DateType{date='明天', description='知来者之可追'}
使用enum关键字定义枚举类
/**
* 使用enum关键字定义枚举类
*/
enum DateType1 {
//1、提供当前枚举类对象,多个对象之间用,隔开 末尾的对象以分号结束
YESTERDAY("昨天", "悟已往之不谏"),
TODAY("今天", "珍惜当下"),
TOMORROW("明天", "知来者之可追");
//2、声明自定义枚举类对象的属性,要用private final修饰
private final String date;
private final String description;
//3、私有化构造方法,并给属性赋值
private DateType1(String date, String description) {
this.date = date;
this.description = description;
}
//4、其他诉求:比如get()方法、toString()方法
public String getDate() {
return date;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return "DateType1{" +
"date='" + date + '\'' +
", description='" + description + '\'' +
'}';
}
}
对比两种实现方式,都需要提供属性(如果有)和私有构造方法。使用enum关键字实现时,非常简洁。
Enum类的常用方法
-
values()方法:返回枚举类的对象数组,该方法可以很方便地遍历所有的枚举值
-
valueOf(String str):如果传入的字符串和枚举类的名称匹配,那么将该字符串转变为对应的枚举类对象。如果不匹配,则抛出 IllegalArgumentException 异常
-
toString:返回当前枚举类对象常量的名称
测试代码
public class EnumTest {
public static void main(String[] args) {
//Enum类的values方法
DateType1[] dateType1s = DateType1.values();
for(DateType1 dateType1 : dateType1s) {
System.out.println(dateType1);
}
//valueOf方法
System.out.println("找到了枚举类:" + DateType1.valueOf("TODAY"));
System.out.println("找到了枚举类:" + DateType1.valueOf("TODAY1"));
}
}
控制台输出
YESTERDAY
TODAY
TOMORROW
找到了枚举类:TODAY
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.canon.enumeration.DateType1.TODAY1
at java.base/java.lang.Enum.valueOf(Enum.java:240)
at com.canon.enumeration.DateType1.valueOf(EnumTest.java:66)
at com.canon.enumeration.EnumTest.main(EnumTest.java:20)
使用enum关键字定义的枚举类实现接口的方式
-
情况一:实现接口,在enum类中实现抽象方法(就和普通的类实现接口一样)
-
情况二:让枚举类的对象分别实现接口中的抽象方法
interface Info {
void show();
}
/**
* 使用enum关键字定义枚举类
*/
enum DateType1 implements Info{
//1、提供当前枚举类对象,多个对象之间用,隔开 末尾的对象以分号结束
YESTERDAY("昨天", "悟已往之不谏") {
@Override
public void show() {
System.out.println("认识到过去的错误已经不可挽回");
}
},
TODAY("今天", "珍惜当下") {
@Override
public void show() {
System.out.println("珍惜时间,珍惜眼前人");
}
},
TOMORROW("明天", "知来者之可追") {
@Override
public void show() {
System.out.println("知道未来的事还来得及补救");
}
};
//2、声明自定义枚举类对象的属性,要用private final修饰
private final String date;
private final String description;
//3、私有化构造方法,并给属性赋值
private DateType1(String date, String description) {
this.date = date;
this.description = description;
}
}