Java进阶之枚举

简介: Java进阶之枚举

Java进阶之枚举
在Java中,我们通常使用 public static final 变量来定义常量,用来声明一些常用而又不会改变的值。
而在Java5中,又提供了一种更加结构化和安全的方式来定义和使用一组固定的常量,那就是枚举。
什么是枚举?
ava 枚举(Enum)是 Java 5 中引入的一个新特性,它是一种特殊的类,可以包含一组固定的常量。枚举用于表示一组固定的值,如星期、月份、状态等。在 Java 中,枚举使用关键字 enum 定义,可以包含方法和变量,也可以实现接口。

  定义枚举
  枚举的定义非常简单,使用关键字 enum,后面跟着枚举的名称和大括号包含的枚举值。
  例如,定义一个表示星期的枚举:
  public enum Weekday {
      MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
  }
  美剧的值一般要大写,和常量一样。

  使用枚举
  使用枚举时,可以直接使用枚举名称调用枚举值。例如,获取星期一的枚举值:
  Weekday monday = Weekday.MONDAY;

  枚举的原理
  枚举实际上是继承自 java.lang.Enum 类的一个特殊类。在编译时期,枚举会被编译成一个final类,该类继承自 java.lang.Enum。
  每个枚举值都是一个 public static final 的实例,这些实例是通过静态代码块创建的。
  例如,上面的 Weekday 枚举在编译后可能如下:
  public final class Weekday extends Enum<Weekday> {
      public static final Weekday MONDAY;
      public static final Weekday TUESDAY;
      public static final Weekday WEDNESDAY;
      public static final Weekday THURSDAY;
      public static final Weekday FRIDAY;
      public static final Weekday SATURDAY;
      public static final Weekday SUNDAY;
      static {
          MONDAY = new Weekday();
          TUESDAY = new Weekday();
          WEDNESDAY = new Weekday();
          THURSDAY = new Weekday();
          FRIDAY = new Weekday();
          SATURDAY = new Weekday();
          SUNDAY = new Weekday();
      }
  }
  由此可见,枚举其实是一个多例模式!
  多例模式(Multiton Pattern)是一种设计模式,它扩展了单例模式的概念。
  在单例模式中,一个类只有一个实例,并且提供一个全局访问点来获取这个实例。
  在多例模式中,一个类可以有多个实例,但是实例的数量是有限的,并且通常也是预先定义好的。
  以后学习设计模式的时候再仔细学习!

  枚举可以包含方法和变量,这些方法和变量可以在枚举的实例中使用。
  例如,给Weekday枚举添加一个获取中文星期名称的方法:
  public enum Weekday {
      MONDAY("星期一"), 
      TUESDAY("星期二"), 
      WEDNESDAY("星期三"), 
      THURSDAY("星期四"), 
      FRIDAY("星期五"), 
      SATURDAY("星期六"), 
      SUNDAY("星期日");
      private String chineseName;
      Weekday(String chineseName) {
          this.chineseName = chineseName;
      }
      public String getChineseName() {
          return chineseName;
      }
  }
  枚举包含变量和方法时,使用的是有参构造,所以定义的枚举值就必须加上参数。

  实现接口枚举可以实现接口,但是不能继承其他类(因为已经继承了 java.lang.Enum 类)。
  例如,给 Weekday 枚举实现一个 Describe 接口,用于描述枚举值:
  public interface Describe {
      String describe();
  }
  public enum Weekday implements Describe {
      MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
      private String chineseName;
      Weekday(String chineseName) {
          this.chineseName = chineseName;
      }
      @Override
      public String describe() {
          return "今天是" + chineseName;
      }
  }

  比如在日常开发中编写一个获取响应状态和提示信息的枚举类:
  // 定义接口
  public interface ResponseStatusInterface {
      int getStatusCode();
      String getMessage();
  }
  // 实现接口的枚举类
  public enum ResponseStatus implements ResponseStatusInterface {
      SUCCESS(200, "操作成功"),
      FAILURE(400, "操作失败"),
      UNAUTHORIZED(401, "未授权"),
      FORBIDDEN(403, "禁止访问"),
      NOT_FOUND(404, "资源未找到"),
      INTERNAL_SERVER_ERROR(500, "服务器内部错误");
      private final int statusCode;
      private final String message;
      ResponseStatus(int statusCode, String message) {
          this.statusCode = statusCode;
          this.message = message;
      }
      @Override
      public int getStatusCode() {
          return statusCode;
      }
      @Override
      public String getMessage() {
          return message;
      }
  }
  // 使用示例
  public class Main {
      public static void main(String[] args) {
          // 获取一个枚举值
          ResponseStatus status = ResponseStatus.SUCCESS;
          // 打印状态码和提示信息
          System.out.println("Status Code: " + status.getStatusCode());
          System.out.println("Message: " + status.getMessage());
      }
  }
  END
目录
相关文章
|
1月前
|
机器学习/深度学习 数据采集 监控
量化交易机器人开发风控模型对比分析与落地要点
本文系统对比规则止损、统计模型、机器学习及组合式风控方案,从成本、鲁棒性、可解释性等维度评估其在合约量化场景的适用性,结合落地实操建议,为不同阶段的交易系统提供选型参考。
|
1月前
|
Docker 容器
创空间什么时候支持docker?
创空间目前尚未正式支持Docker,尽管界面已显示Beta选项,但暂不可用。具体上线时间请关注官方更新公告。
93 1
|
28天前
|
存储 监控 API
Python datetime模块:时间处理的瑞士军刀
免费Python编程教程,深入讲解datetime模块核心用法:时间对象创建、格式化、运算及时区处理,附实战案例与避坑指南,助你高效掌握Python时间操作。链接:https://pan.quark.cn/s/2c17aed36b72
510 0
|
11月前
|
前端开发 JavaScript 测试技术
React 时间选择器 Time Picker:常见问题与调试指南
本文介绍了在使用 React 时间选择器时常见的问题及解决方案,包括时间格式不匹配、时区问题、禁用时间范围和自定义样式等。通过代码案例详细解释了如何避免这些问题,强调了阅读文档、类型检查、单元测试和调试技巧的重要性。
282 7
|
4月前
|
人工智能 Android开发 iOS开发
安卓版快捷指令,加了AI语音可以一句话操作v0.2.7
Shortcuts for Android(SFA)是一款安卓自动化工具,支持语音创建快捷指令,实现听歌、导航、发消息等操作。操作简单,提升效率,快来体验语音控制的便捷!
739 0
安卓版快捷指令,加了AI语音可以一句话操作v0.2.7
|
11月前
|
C语言
【C语言】break 关键字详解
- `break` 关键字用于提前退出循环体或 `switch` 语句的执行。 - 在 `for`、`while` 和 `do-while` 循环中,`break` 可以帮助程序在满足特定条件时退出循环。 - 在 `switch` 语句中,`break` 用于终止 `case` 代码块的执行,避免代码“穿透”到下一个 `case`。 - 注意 `break` 只会退出最内层的循环或 `switch` 语句,确保在嵌套结构中正确使用 `break` 以避免意外的控制流行为。
1195 2
|
JavaScript 前端开发 easyexcel
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
本文展示了基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的完整过程,包括后端使用EasyExcel生成Excel文件流,前端通过Blob对象接收并触发下载的操作步骤和代码示例。
2603 0
基于SpringBoot + EasyExcel + Vue + Blob实现导出Excel文件的前后端完整过程
|
XML Java 数据格式
IDEA 设置JSP启动页面/默认页面
IDEA 设置JSP启动页面/默认页面
402 0
Mac Jmeter导入外部.jmx文件时报错“com.thoughtworks.xstream.converters.ConversionException”
Mac Jmeter导入外部.jmx文件时报错“com.thoughtworks.xstream.converters.ConversionException”
Mac Jmeter导入外部.jmx文件时报错“com.thoughtworks.xstream.converters.ConversionException”