java5特性_JAVA5特性(2:枚举)

深入理解枚举类型,文章写得很好。

http://blog.csdn.net/javazejian/article/details/71333103

枚举是什么?

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型。

之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

枚举的定义

//这是在没有枚举类型时定义常量常见的方式

public class DayDemo {

public static final int MONDAY =1;

public static final int TUESDAY=2;

public static final int WEDNESDAY=3;

public static final int THURSDAY=4;

public static final int FRIDAY=5;

public static final int SATURDAY=6;

public static final int SUNDAY=7;

}

//枚举

enum Day {

MONDAY, TUESDAY, WEDNESDAY,

THURSDAY, FRIDAY, SATURDAY, SUNDAY

}

相当简洁,在定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型

枚举实现原理

我们大概了解了枚举类型的定义与简单使用后,现在有必要来了解一下枚举类型的基本实现原理。实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。

public class EnumDemo {

public static void main(String[] args){

//直接引用

Day day =Day.MONDAY;

}

}

//定义枚举类型

enum Day {

MONDAY, TUESDAY, WEDNESDAY,

THURSDAY, FRIDAY, SATURDAY, SUNDAY

}

编译EnumDemo.java并查看生成的class文件来看一下:

//反编译Day.class

final class Day extends Enum

{

//编译器为我们添加的静态的values()方法

public static Day[] values()

{

return (Day[])$VALUES.clone();

}

//编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法

public static Day valueOf(String s)

{

return (Day)Enum.valueOf(com/zejian/enumdemo/Day, s);

}

//私有构造函数

private Day(String s, int i)

{

super(s, i);

}

//前面定义的7种枚举实例

public static final Day MONDAY;

public static final Day TUESDAY;

public static final Day WEDNESDAY;

public static final Day THURSDAY;

public static final Day FRIDAY;

public static final Day SATURDAY;

public static final Day SUNDAY;

private static final Day $VALUES[];

static

{

//实例化枚举实例

MONDAY = new Day("MONDAY", 0);

TUESDAY = new Day("TUESDAY", 1);

WEDNESDAY = new Day("WEDNESDAY", 2);

THURSDAY = new Day("THURSDAY", 3);

FRIDAY = new Day("FRIDAY", 4);

SATURDAY = new Day("SATURDAY", 5);

SUNDAY = new Day("SUNDAY", 6);

$VALUES = (new Day[] {

MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY

});

}

}

从反编译的代码可以看出编译器确实帮助我们生成了一个Day类(注意该类是final类型的,将无法被继承)而且该类继承自java.lang.Enum类,该类是一个抽象类。

除此之外,编译器还帮助我们生成了7个Day类型的实例对象分别对应枚举中定义的7个日期,这也充分说明了我们前面使用关键字enum定义的Day类型中的每种日期枚举常量也是实实在在的Day实例对象,只不过代表的内容不一样而已。

注意编译器还为我们生成了两个静态方法,分别是values()和 valueOf(),到此我们也就明白了,使用关键字enum定义的枚举类型,在编译期后,也将转换成为一个实实在在的类,而在该类中,会存在每个在枚举类型中定义好变量的对应实例对象,如上述的MONDAY枚举类型对应public static final Day MONDAY,同时编译器会为该类创建两个方法,分别是values()和valueOf()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值