enum java 原理_Java学习-枚举-底层实现原理初探

写在前面的话

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

整数枚举替代法

使用方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值