8.1 枚举
8.1.1 什么是枚举
类的对象只有有限个的、确定的
例如:
星期:Monday(星期一)......Sunday(星期天)
性别:Man(男)、Woman(女)
月份:January(1月)......December(12月)
季节:Spring(春节)......Winter(冬天)
七彩标准色:Red(红)......Purple(紫)
支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
就职状态:Busy、Free、Vocation、Dimission
订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、Delivered(已发货)、Return(退货)、Checked(已确认)
8.1.2 如何定义枚举类型
要点:
- 私有化类的构造器,保证不能在类的外部创建其对象
- 在类的内部创建枚举类的实例。声明为:public static final
JDK1.5之前:
public class TestEnumType {
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之后:
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum类。因此不能再继承其他类。
- 枚举类的所有构造器只能使用 private 访问控制符
- 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾),必须在枚举类的第一行声明枚举类对象。列出的实例系统会自动添加 public static final 修饰
- JDK 1.5 之后可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字
package com.enumtype.after15;
public class TestEnumType {
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; } |
8.1.3 java.lang.Enum类的方法
除了toString方法,都是final修饰的方法,因此都不能重写
还有两个API文档中没有,但枚举类类拥有并且常用的方法
- values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
- valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
8.1.4 枚举的特别说明
1、枚举中定义属性
- 枚举类对象的属性不应允许被改动, 所以应该使用 private final修饰。不是语法要求,而是语义要求。
- 枚举类的使用 private final 修饰的属性应该在构造器中为其赋值。
- 若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数。
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(); } |
8.1.5 关于枚举的拓展
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。