您的位置 首页 java

JavaSE进阶枚举

枚举

一、什么是枚举

类的对象只有有限个的、确定的

例如:

星期:Monday(星期一)……Sunday(星期天)

性别:Man(男)、Woman(女)

月份: January (1月)……December(12月)

季节:Spring(春节)……Winter(冬天)

七彩标准色:Red(红)……Purple(紫)

支付方式:Cash(现金)、 WeChat Pay( 微信 )、 ALIPAY ( 支付宝 )、BankCard(银行卡)、 CreditCard (信用卡)

就职状态:Busy、Free、Vocation、Dimission

订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已确认)

二、如何定义枚举类型

要点:

l 私有化类的 构造器 ,保证不能在类的外部创建其对象

l 在类的内部创建枚举类的实例。声明为:public static final

JDK 1.5之前:

 public class Test Enum Type {

public static void main(String[] args) {
Season s = Season.SPRING;
System.out.println(s);
}

}
class Season{
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();

private Season(){
}

public String toString(){
if(this ==  SPRING ){
return "SPRING";
}else if(this == SUMMER){
return "SUMMER";
}else if(this == AUTUMN){
return "AUTUMN";
}else{
return "WINTER";
}
}
}  

JDK1.5 之后:

l 使用 enum 定义的枚举类默认继承了 java.lang.Enum类。因此不能再继承其他类。

l 枚举类的所有构造器只能使用 private 访问控制符

l 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾),必须在枚举类的第一行声明枚举类对象。列出的实例系统会自动添加 public static final 修饰

l JDK 1.5 之后可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字

 package com.enumtype.after15;

public class Test enum Type {

public static void main(String[] args) {
Season s = Season.SPRING;
switch(s){
case SPRING:
System.out.println("春暖花开");break;
case SUMMER:
System.out.println("夏日炎炎");break;
case AUTUMN:
System.out.println("秋高气爽");break;
case WINTER:
System.out.println("白雪皑皑");break;
}
}

}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER;
}  

三、 java .lang.Enum类的方法

除了toString方法,都是final修饰的方法,因此都不能重写

还有两个API文档中没有,但枚举类类拥有并且常用的方法

l values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

l valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。

四、枚举的特别说明

1、枚举中定义属性

l 枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰。 不是语法要求,而是语义要求

l 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。

l 若枚举类显式地定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。

 package com.enumtype.before15;

public class TestWeekField {

public static void main(String[] args) {
Week w = Week.MONDAY;
System.out.println(w);
}
}
enum Week{
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六"),
SUNDAY("星期日");
private final String DESCRPTION;

private Week(String dESCRPTION) {
DESCRPTION = dESCRPTION;
}
public String toString(){
return DESCRPTION;
}
}  

2、枚举类可以自定义方法,静态和非静态

3、枚举类可以实现一个或者多个接口(了解)

若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。

若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法

 interface Change{
void degenerate();
}
interface Checkable{
void check();
}
enum Gender implements Change,Checkable{
MAN{
public void degenerate(){
System.out.println("咔嚓一刀");
}
},WOMAN{
public void degenerate(){
System.out.println("比较复杂");
}
};
public void check(){
System.out.println("脱光");
}
}  

4、枚举类可以自己定义抽象方法(了解)

 enum Payment{
CASH{
public void pay(){
System.out.println("现金支付");
}
},
WECHAT{
public void pay(){
System.out.println("微信支付");
}
},
ALIPAY{
public void pay(){
System.out.println("支付鸨支付");
}
},
CARD{
public void pay(){
System.out.println("银行卡支付");
}
},
CREDIT{
public void pay(){
System.out.println("信用卡支付");
}
};
public abstract void pay();
}  

五、关于枚举的拓展

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这两个集合的使用就不在这里赘述,可以参考JDK文档。


更多精彩内容:

文章来源:智云一二三科技

文章标题:JavaSE进阶枚举

文章地址:https://www.zhihuclub.com/186264.shtml

关于作者: 智云科技

热门文章

网站地图