Enum底层实现初探(一)

写在前面的话

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

整数枚举替代法

使用方法

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这个语法糖。

你可能感兴趣的:(java)