1. 定义枚举类
当类的对象只有有限个、确定的时,建议使用枚举类。比如:
星期:Monday、、Sunday;
季节:Spring、、Winter;
线程状态:创建、就绪、运行、阻塞、死亡;
使用enum关键字来自定义枚举类
public enum Season {
// 1.提供当前枚举类的对象,逗号隔开, 默认private static final
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
// 2.声明Season对象的属性, prviate final 修饰
private final String seasonName;
private final String seasonDesc;
// 3. 构造器,默认private
Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4. 其他诉求
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
然后就可以直接调用Season类中的常量对象:
public class Test {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}
【注意点】
- 枚举类中对象的声明一定要写在最前面
- 对象之间用
逗号
隔开,最后一个对象后加分号
- 枚举类的对象默认且只能为 private static final,并且不允许另加修饰符
- 枚举类的属性可以自定以修饰符,但是最好用prviate final修饰
- 枚举类的
构造器
默认且只能为prviate,不能用public修饰
2. Enum类的主要方法
枚举类的直接父类不是Object,而是Enum
,
Enum类主要有以下几个方法供使用:
方法名 | 详细描述 |
---|---|
values | 返回枚举类型的对象数组。该方法可以很方便地遍历所有枚举常量 |
valueOf | 传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,会得到与参数匹配的枚举常量。说白了就是由名字返回枚举常量,如果不存在则返回异常 |
toString | 得到当前枚举常量的名称,仅此而言,一般会重写 |
equals | 在枚举类中可以直接使用== 来比较两个枚举常量是否相等。Enum提供的这个equals方法,也是直接使用== 来实现的。它的存在是为了在Set、List和Map中使用。注意,它是不可变的 |
hashCode | Enum实现了hashCode()来和equals()保持一致,它也是不可变的 |
getDeclaringClass | 得到枚举常量所属枚举类型的Class对象。可以用它来判断两个枚举常量是否属于同一个枚举类型 |
name | 得到当前枚举常量的名称 |
ordinal | 得到当前枚举常量的次序 |
compareTo | 枚举类型实现了Comparable接口,这样可以比较两个枚举常量的大小 |
clone | 枚举类不能被Clone。为了防止子类实现克隆方法,Enum实现了一个仅抛出CloneNotSupportedException 异常的不变 Clone() |
3. 实现接口的枚举类
枚举类实现接口和普通class实现接口的格式差不多,都是实现其中的方法:
public enum Season implements Info {
// 1.提供当前枚举类的对象,逗号隔开, 默认private static final
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
// 2.声明Season对象的属性, prviate final 修饰
private final String seasonName;
private final String seasonDesc;
// 3. 构造器,默认private
Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
@Override
public void show() {
System.out.println("这是个季节枚举类");
}
}
但是,这样的话,每个枚举常量实现的方法体都是一样的,这样的话枚举就没有意义了。因此,枚举类支持对每个枚举常量单独继续接口实现,每个枚举常量的方法体可以不同
public enum Season implements Info {
// 1.提供当前枚举类的对象,逗号隔开, 默认private static final
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("这是冬天");
}
};
// 2.声明Season对象的属性, prviate final 修饰
private final String seasonName;
private final String seasonDesc;
// 3. 构造器,默认private
Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}