当类的对象只有确定的有限个,我们称此类为枚举类
当需要定义一组常量时,强烈推荐使用枚举类
如果枚举类中只有一个对象,则可以作为单例模式的实现方式
目录
自定义枚举类
在 JDK 5.0 之前,我们需要自定义枚举类
public class EnumerateTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}
//自定义枚举类:四季
class Season{
//1. 声明 Season 对象的属性:private final 修饰
private final String seasonName;
private final String seasonDesc;
//2. 私有化类的构造器,并给对象属性赋值
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3. 提供当前枚举类的多个对象:private 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("冬天","冬日夏云");
//其他:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//其他:提供toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
>>> Season{seasonName='春天', seasonDesc='春暖花开'}
关键字enum定义枚举类
在 JDK 5.0 及之后,我们可以使用 enum 关键字来定义枚举类
public class EnumerateTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}
//enum关键字定义枚举类:四季
enum Season{
//1. 提供当前枚举类的对象,多个对象之间用 “,” 隔开,末尾对象 “;” 结束
SPRING ("春天","春暖花开"),
SUMMER ("夏天","夏日炎炎"),
AUTUMN ("秋天","秋高气爽"),
WINTER ("冬天","冬日夏云");
//2. 声明 Season 对象的属性:private final 修饰
private final String seasonName;
private final String seasonDesc;
//3. 私有化类的构造器,并给对象属性赋值
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//其他:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//其他:提供toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
>>> Season{seasonName='春天', seasonDesc='春暖花开'}
enum类的主要方法
values() | 返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值 |
valueOf(String str) | 可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的 “名字” 。如果不是,会有运行时异常 |
toString() | 返回当前枚举类对象常量的名称 |
public class EnumerateTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
//toString()
System.out.println(spring.toString());
System.out.println("************");
//values()
Season[] values = Season.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
System.out.println("************");
Thread.State[] values1 = Thread.State.values();
for (int i = 0; i < values1.length; i++) {
System.out.println(values1[i]);
}
System.out.println("************");
//valueOf()
Season winter = Season.valueOf("WINTER");
System.out.println(winter);
}
}
enum Season{
//与上一个代码块代码相同
}
>>> Season{seasonName='春天', seasonDesc='春暖花开'}
************
Season{seasonName='春天', seasonDesc='春暖花开'}
Season{seasonName='夏天', seasonDesc='夏日炎炎'}
Season{seasonName='秋天', seasonDesc='秋高气爽'}
Season{seasonName='冬天', seasonDesc='冬日夏云'}
************
NEW
RUNNABLE
BLOCKED
WAITING
TIMED_WAITING
TERMINATED
************
Season{seasonName='冬天', seasonDesc='冬日夏云'}
enum关键字定义枚举类实现接口
实现接口,可以在 enum 类中实现抽象方法,也可以让枚举类的对象分别实现接口中的抽象方法
public class EnumerateTest {
public static void main(String[] args) {
Season winter = Season.valueOf("WINTER");
winter.show();
}
}
interface Info{
void show();
}
//enum关键字定义枚举类:四季
enum Season 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("冬天来了");
}
};
}
>>> 冬天来了