【Java基础系列教程】第十六章 Java枚举类

心已赠人 2024-04-28 13:15 197阅读 0赞

一、枚举类概述

类的对象只有有限个,确定的。举例如下:
星期:Monday(星期一)、……、Sunday(星期天);
性别:Man(男)、Woman(女);
季节:Spring(春节)……Winter(冬天);
支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡);
就职状态:Busy、Free、Vocation、Dimission;
订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Return(退货)、Checked(已确认)Fulfilled(已配货);
线程状态:创建、就绪、运行、阻塞、死亡;

当需要定义一组常量时,强烈建议使用枚举类。

枚举类的实现:
JDK1.5之前需要自定义枚举类;
JDK1.5新增的 enum 关键字用于定义枚举类;

若枚举只有一个对象,则可以作为一种单例模式的实现方式。

枚举类的属性:
枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰;
枚举类的使用 private final 修饰的属性应该在构造器中为其赋值;
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数;

二、自定义枚举类

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

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

3、对象如果有实例变量,应该声明为private final,并在构造器中初始化;

  1. public class SeasonTest {
  2. public static void main(String[] args) {
  3. Season spring = Season.SPRING;
  4. System.out.println(spring);
  5. }
  6. }
  7. // 自定义枚举类
  8. class Season {
  9. // 1.声明Season对象的属性:private final修饰
  10. private final String seasonName;
  11. private final String seasonDesc;
  12. // 2.私有化类的构造器,并给对象属性赋值
  13. private Season(String seasonName, String seasonDesc) {
  14. this.seasonName = seasonName;
  15. this.seasonDesc = seasonDesc;
  16. }
  17. // 3.提供当前枚举类的多个对象:public static final的
  18. public static final Season SPRING = new Season("春天", "春暖花开");
  19. public static final Season SUMMER = new Season("夏天", "夏日炎炎");
  20. public static final Season AUTUMN = new Season("秋天", "秋高气爽");
  21. public static final Season WINTER = new Season("冬天", "白雪皑皑");
  22. // 4.其他诉求1:获取枚举类对象的属性
  23. public String getSeasonName() {
  24. return seasonName;
  25. }
  26. public String getSeasonDesc() {
  27. return seasonDesc;
  28. }
  29. // 4.其他诉求2:提供toString()
  30. @Override
  31. public String toString() {
  32. return "Season{" +
  33. "seasonName='" + seasonName + '\'' +
  34. ", seasonDesc='" + seasonDesc + '\'' +
  35. '}';
  36. }
  37. }

三、使用enum定义枚举类

使用说明:
使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再继承其他类;
枚举类的构造器只能使用 private 权限修饰符;
枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾)。列出的实例系统会自动添加 public static final 修饰;
必须在枚举类的第一行声明枚举类对象;

JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。

  1. public class SeasonTest {
  2. public static void main(String[] args) {
  3. Season summer = Season.SUMMER;
  4. System.out.println(summer);
  5. }
  6. }
  7. // 使用enum关键字枚举类
  8. enum Season {
  9. // 1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
  10. SPRING("春天", "春暖花开"),
  11. SUMMER("夏天", "夏日炎炎"),
  12. AUTUMN("秋天", "秋高气爽"),
  13. WINTER("冬天", "冰天雪地");
  14. // 2.声明Season对象的属性:private final修饰
  15. private final String seasonName;
  16. private final String seasonDesc;
  17. // 3.私有化类的构造器,并给对象属性赋值
  18. private Season(String seasonName, String seasonDesc) {
  19. this.seasonName = seasonName;
  20. this.seasonDesc = seasonDesc;
  21. }
  22. // 4.其他诉求1:获取枚举类对象的属性
  23. public String getSeasonName() {
  24. return seasonName;
  25. }
  26. public String getSeasonDesc() {
  27. return seasonDesc;
  28. }
  29. // 4.其他诉求2:提供toString()
  30. /*@Override
  31. public String toString() {
  32. return "Season{" +
  33. "seasonName='" + seasonName + '\'' +
  34. ", seasonDesc='" + seasonDesc + '\'' +
  35. '}';
  36. }*/
  37. }

四、Enum类的主要方法

watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBA5oiR5piv5rOi5ZOp5Liq5rOi_size_16_color_FFFFFF_t_70_g_se_x_16

Enum类的主要方法:

values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
values()从哪儿来的?重点就在于enum关键字。首先,enum声明实际上定义了一个类。因此我们可以通过定义的enum调用其方法。其次,Java编译器会自动在enum类型中插入一些方法,其中就包括values()——所以我们的程序在没编译的时候,自然没法查看values()方法的源码了。

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

toString():返回当前枚举类对象常量的名称。

  1. public class SeasonTest {
  2. public static void main(String[] args) {
  3. Season summer = Season.SUMMER;
  4. //toString():返回枚举类对象的名称
  5. System.out.println(summer.toString());
  6. // 通过反射获取当前对象的父类
  7. // System.out.println(Season1.class.getSuperclass());
  8. System.out.println("-----------------------------------");
  9. // values():返回所有的枚举类对象构成的数组
  10. Season[] values = Season.values();
  11. for (int i = 0; i < values.length; i++) {
  12. System.out.println(values[i]);
  13. }
  14. System.out.println("-----------------------------------");
  15. Thread.State[] values1 = Thread.State.values();
  16. for (int i = 0; i < values1.length; i++) {
  17. System.out.println(values1[i]);
  18. }
  19. System.out.println("-----------------------------------");
  20. // valueOf(String objName):返回枚举类中对象名是objName的对象。
  21. Season winter = Season.valueOf("WINTER");
  22. // 如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
  23. // Season winter = Season.valueOf("WINTER1");
  24. System.out.println(winter);
  25. }
  26. }

五、实现接口的枚举类

和普通 Java 类一样,枚举类可以实现一个或多个接口。

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

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

  1. interface Info {
  2. void show();
  3. }
  4. //使用enum关键字枚举类
  5. enum Season implements Info {
  6. //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
  7. SPRING("春天", "春暖花开") {
  8. @Override
  9. public void show() {
  10. System.out.println("春天在哪里");
  11. }
  12. },
  13. SUMMER("夏天", "夏日炎炎") {
  14. @Override
  15. public void show() {
  16. System.out.println("宁静的夏天");
  17. }
  18. },
  19. AUTUMN("秋天", "秋高气爽") {
  20. @Override
  21. public void show() {
  22. System.out.println("秋天不回来");
  23. }
  24. },
  25. WINTER("冬天", "冰天雪地") {
  26. @Override
  27. public void show() {
  28. System.out.println("大约在冬季");
  29. }
  30. };
  31. //2.声明Season对象的属性:private final修饰
  32. private final String seasonName;
  33. private final String seasonDesc;
  34. //2.私有化类的构造器,并给对象属性赋值
  35. private Season(String seasonName, String seasonDesc) {
  36. this.seasonName = seasonName;
  37. this.seasonDesc = seasonDesc;
  38. }
  39. //4.其他诉求1:获取枚举类对象的属性
  40. public String getSeasonName() {
  41. return seasonName;
  42. }
  43. public String getSeasonDesc() {
  44. return seasonDesc;
  45. }
  46. //4.其他诉求1:提供toString()
  47. /*@Override
  48. public String toString() {
  49. return "Season{" +
  50. "seasonName='" + seasonName + '\'' +
  51. ", seasonDesc='" + seasonDesc + '\'' +
  52. '}';
  53. }*/
  54. @Override
  55. public void show() {
  56. System.out.println("这是一个季节");
  57. }
  58. }

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java基础

    定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象;再比如行星类,目前只有8个对象。这种实例有限而且固定的类,在Java里被称为枚举类。 Ja

    相关 Java基础--

    枚举类: JDK1.5以后新增了enum关键字,用来定义枚举类,枚举类是一种特殊的类, 它可以定义成员变量,方法,可以实现一个或者多个接口,也可以定义自己的构