1.枚举类介绍
类的对象只有有限个,且是确定的。如:
- 星期:Monday、······、Sunday
- 性别:Man、Woman
- 季节:Spring、Summer、Autumn、Winter
- 支付方式:Cash、WeChat、Alipay、BankCard、CreditCard
- 就职状态:Busy、Free、Vocation、Dimission
- 订单状态:Nonpayment、Paid、Fulfilled、Delivered、Return、Checkd
- 线程状态:创建、就绪、运行、阻塞、死亡
- 当需要定义一组常量时,强烈建议使用枚举
- 如果枚举类中值只有一个对象,则可以作为一种单例模式的实现方式
2. 如何自定义枚举类
2.1 JDK5之前自定义枚举类
- 声明对象的属性,使用
private final
修饰 - 私有化类的构造器,并为对象的属性赋值
- 提供当前枚举类的多个对象,并使用
public static final
修饰 - 其它需求,例如获取枚举类的属性、
toString()
方法的重写等
class Season {
// 声明Season对象的属性
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 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. 其他需求
public String getSeasonDesc() {
return seasonDesc;
}
// 5. toString
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
2.2 JDK5新增enum关键字方式
- 提供当前枚举类的对象,多个对象之间用
,
隔开,末尾对象;
结束 - 根据需求编写相关方法,如
toString()
- 使用
enum
关键字定义的枚举类默认继承于Enum
类
enum Season {
// 1.提供当前枚举类的多个对象
SPRING("春天", "春暖花开"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地");
// 2. 声明Season对象的属性
private final String seasonName;
private final String seasonDesc;
// 3. 私有化类的构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4. 其他需求
public String getSeasonDesc() {
return seasonDesc;
}
}
3. Enum类的主要方法
方法名 | 详细描述 |
---|---|
valueOf() | 传递枚举类型的Class 对象和枚举常量名称给静态方法valueOf() ,会得到与参数匹配的枚举常量 |
toString() | 得到当前枚举常量的名称,你可以通过重写这个方法使得到的结果更易读 |
equals() | 在枚举类型中可以直接使用== 来比较两个枚举常量是否相等。Enum 提供的这个equals() 方法,也是直接使用== 实现的。它的存在是为了在Set 、List 、Map 中使用。主语,equals() 是不可变的 |
hashCode() | Enum 实现了hashCode() 方法来和equals() 方法保持一致。它也是不可变的 |
getDeclaringClass() | 得到枚举常量所属枚举类型的Class 对象。可以用它来判断两个枚举常量是否属于同一个枚举类型。 |
name() | 得到当前枚举常量的名称。建议优先使用toString |
ordinal() | 得到当前枚举常量的次序 |
compareTo() | 枚举类型实现了Comparable 接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列) |
clone() | 枚举类型不能被clone() ,为了防止子类实现克隆方法,Enum 实现了一个仅输出CloneNotSupportedException 异常的不变clone() 。 |
public class SeasonTest {
public static void main(String[] args) {
System.out.println("Season.SPRING.toString(): " + Season.SPRING.toString());
System.out.println("Arrays.toString(Season.values()): " + Arrays.toString(Season.values()));
Season spring = Season.valueOf("SPRING");
System.out.println(spring);
}
}
运行结果:
Season.SPRING.toString(): SPRING Arrays.toString(Season.values()): [SPRING, SUMMER, AUTUMN, WINTER] SPRING
4. 实现接口的枚举类
4.1 情况一:在Enum类中实现抽象方法
此方法和在普通对象中实现接口没有区别
interface Info {
void show();
}
enum Season implements Info{
// 1.提供当前枚举类的多个对象
SPRING("春天", "春暖花开"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地");
// 2. 声明Season对象的属性
private final String seasonName;
private final String seasonDesc;
// 3. 私有化类的构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4. 其他需求
public String getSeasonDesc() {
return seasonDesc;
}
// 重写抽象方法
@Override
public void show() {
System.out.println("这是一个季节");
}
}
4.2 情况二:每个枚举对象分别实现抽象方法
这种方式可以实现每个对象实现的方法体内容不一样
enum Season implements Info {
// 1.提供当前枚举类的多个对象
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对象的属性
private final String seasonName;
private final String seasonDesc;
// 3. 私有化类的构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 4. 其他需求
public String getSeasonDesc() {
return seasonDesc;
}
}