Java进阶之枚举

简介: 【7月更文挑战第11天】Java枚举是Java 5引入的特性,用于定义固定常量集合,如星期。枚举是继承自`java.lang.Enum`的特殊类,编译后成为final类,每个枚举值是静态final实例。定义枚举用`enum`关键字,如`public enum Weekday {MONDAY, TUESDAY, ...}`。枚举可包含方法和变量,能实现接口但不能继承其他类。例如,`Weekday`枚举可实现`Describe`接口,提供`describe()`方法。在实际应用中,枚举常用于表示如响应状态等固定选项,便于类型安全和代码阅读。

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
目录
相关文章
|
7月前
|
前端开发 JavaScript Java
【前端学java】Java中的接口和枚举概念(8)
【8月更文挑战第9天】Java中的接口和枚举概念(8)
62 4
|
4月前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
152 60
|
4月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
86 24
|
6月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
122 9
Java——反射&枚举
|
6月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
112 5
|
6月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
472 1
|
7月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
7月前
|
Java 开发者
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案。本文通过技术综述及示例代码,剖析两者在性能上的差异。if-else具有短路特性,但条件增多时JVM会优化提升性能;switch则利用跳转表机制,在处理大量固定选项时表现出色。通过实验对比可见,switch在重复case值处理上通常更快。尽管如此,选择时还需兼顾代码的可读性和维护性。理解这些细节有助于开发者编写出既高效又优雅的Java代码。
97 2
|
8月前
|
Java Perl
Java进阶之正则表达式
【7月更文挑战第17天】正则表达式(RegEx)是一种模式匹配工具,用于在字符串中执行搜索、替换等操作。它由普通字符和特殊元字符组成,后者定义匹配规则。
48 4
|
7月前
|
安全 Java 编译器

热门文章

最新文章