Java学习-枚举-底层实现原理初探

本文探讨了枚举类型的三种实现方式:整数枚举、类型安全类替代和enum语法糖。详细介绍了每种方法的使用及优缺点,最后深入解析了enum语法糖的底层实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面的话

此篇文章借鉴了网上很多大神的思想,因为太多,就不一一列举。如有雷同,敬请原谅。

整数枚举替代法

使用方法

public class Season{
    public static final int SPRING = 0;
    public static final int SUMMER = 1;
    public static final int FALL = 2;
    public static final int WINTER = 3;
}

类型安全问题

无法保证用户不传入其它意想不到的值,比如可能传入5进来。

字符串的表达问题

不能方便的获得字符串

类型安全类替代法

使用方法

public class Season2 {

  private Season2(String s) {
    m_name = s;
  }

  public String toString() {
    return m_name;
  }

  private final String m_name;

  public static final Season2 SPRING = new Season2("Spring");

  public static final Season2 SUMMER = new Season2("Summer");

  public static final Season2 FALL = new Season2("Fall");

  public static final Season2 WINTER = new Season2("Winter");
}

特点

  • 定义一个类,用这个类的实例来表达枚举值
  • 不提供公开构造函数以杜绝客户自己生成该类的实例
  • 所有的类的实例都是final的,不允许有任何改动
  • 所有的类的实例都是public static的,这样客户可以直接使用它
  • 所有的枚举值都是唯一的,所以程序中可以使用==运算符,而不必使用费时的equals()方法

比较完整的实现

public class Seanson3 {

  private Seanson3(String s) {
    m_ordinal = m_nextOrdinal++;
    m_name = s;
  }

  public String toString() {
    return m_name;
  }

  public String Name() {
    return m_name;
  }

  public int compareTo(Object obj) {
    return m_ordinal - ((Seanson3) obj).m_ordinal;
  }

  public static Seanson3[] values() {
    return m_seasons;
  }

  public static Seanson3 valueOf(String s) {
    for (Seanson3 m_season : m_seasons)
      if (m_season.Name().equals(s))
        return m_season;
    throw new IllegalArgumentException(s);
  }

  private final String m_name;
  private static int m_nextOrdinal = 0;

  private final int m_ordinal;
  public static final Seanson3 SPRING;
  public static final Seanson3 SUMMER;
  public static final Seanson3 FALL;
  public static final Seanson3 WINTER;
  private static final Seanson3 m_seasons[];

  static {
    SPRING = new Seanson3("Spring");
    SUMMER = new Seanson3("Summer");
    FALL = new Seanson3("Fall");
    WINTER = new Seanson3("Winter");
    m_seasons = (new Seanson3[] { SPRING, SUMMER, FALL, WINTER });
  }
}

enum语法糖的底层实现

javac当检测到enum这个语法糖的时候,会自动编译成“比较完整的实现”类似的类,这样就可以通过不修改执行器,来实现enum这个语法糖。

TODO

  • 通过javap来反编译一个enum的生成代码
  • 自己实现一个MyEnum

转载于:https://my.oschina.net/u/2895301/blog/829758

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值