写在前面的话
此篇文章借鉴了网上很多大神的思想,因为太多,就不一一列举。如有雷同,敬请原谅。
整数枚举替代法
使用方法
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