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
目录
相关文章
|
2天前
|
Java 开发者
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案。本文通过技术综述及示例代码,剖析两者在性能上的差异。if-else具有短路特性,但条件增多时JVM会优化提升性能;switch则利用跳转表机制,在处理大量固定选项时表现出色。通过实验对比可见,switch在重复case值处理上通常更快。尽管如此,选择时还需兼顾代码的可读性和维护性。理解这些细节有助于开发者编写出既高效又优雅的Java代码。
6 2
|
25天前
|
Java Perl
Java进阶之正则表达式
【7月更文挑战第17天】正则表达式(RegEx)是一种模式匹配工具,用于在字符串中执行搜索、替换等操作。它由普通字符和特殊元字符组成,后者定义匹配规则。
17 4
|
27天前
|
存储 缓存 Java
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
|
28天前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
17 4
|
28天前
|
设计模式 Java
Java进阶之代理
Java进阶之代理
16 3
|
28天前
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
17 2
|
6天前
|
Java
【Java】内部类、枚举、泛型
【Java】内部类、枚举、泛型
|
29天前
|
Java 编译器 API
Java进阶之标准注解
【7月更文挑战第15天】Java标准注解包括标记注解(如@Deprecated)、@Override(检查方法重写)、@SuppressWarnings(抑制警告)。多值注解如@RequestMapping在Spring中用于HTTP请求映射。元注解如@Retention控制注解保留策略,@Target指定应用位置。Java8引入类型注解(@FunctionalInterface、@SafeVarargs)和重复注解(@Repeatable)。自定义注解可通过反射读取,如示例中的MyMarkerAnnotation等。
17 2
|
29天前
|
Java 编译器 API
Java进阶之标准注解
Java进阶之标准注解
19 1
|
1月前
|
IDE Java 测试技术
Java进阶之反射
【7月更文挑战第14天】Java反射机制允许在运行时动态获取类信息、创建对象及调用其方法。它基于`Class`类,让我们能访问类的属性、方法、构造器。例如,通过`Class.forName()`加载类,`Class.newInstance()`创建对象,`Method.invoke()`执行方法。反射广泛应用于动态代理、单元测试、序列化及框架中,提供灵活性但牺牲了性能,且可破坏封装性。IDE的代码补全也是反射的应用之一。在使用时需谨慎,避免对私有成员的不当访问。
24 1