作者: linjl_ll 时间: 2013-10-27 17:44
1,为什么要用枚举?
2,枚举是不是相当于内部类?
在实际的开发中有些值只能取有限个值中的一个,例如性别:男女、季节:春夏秋冬,星期:一~日。那么我们如何在我们的java程序中体现他们呢?先抛开枚举,我们用java中普通的类来实现。如何实现呢?以季节为例,首先这个类只有四个对象春夏秋冬,不可能还有其他季节,所以我们不能让使用者创建对象(构造方法必须是私有的),那使用者如何获取季节对象呢?我们帮他提前就生成4个对象,当有需要时直接获取需要的值即可。代码如下:
class Season{
private String name;
private Season(String name){
this.name = name;
};
public static final Season SPRINT= new Season("SPRINT");
public static final Season SUMMER= new Season("SUMMER
public static final Season AUTUMN= new Season("AUTUMN");
public static final Season WINTER= new Season("WINTER");
}
在使用时:Season var = Season.WINTER;
可以说上面的代码是实现大部分"只能取有限个值中的一个"的模板,既然大部分的实现都和上面的代码类似,那么我们为什么要让开发人员做一些重复的工作呢?所以sun公司在1.5版本中推出了枚举,它替我们实现了很多代码,让我们编写代码更为轻松。将季节这个类用enum来实现代码如下:
enum Season{
SPRINT,SUMMER,AUTUMN,WINTER
}
使用一样是:Season.WINTER;它包含了上述用类来实现的全部功能,并且还有扩展比如有ordinal(),valueOf()等方法。
所以我的理解是在实际的开发中"只能取有限个值中的一个"的情况非常常见,用java 中的类来实现的话大部分的代码是差不多,为了我们开发更为快捷,推出enum让enum帮我们做大部分的代码工作。
所以第一个问题我的理解是方便我们开发,提高开发效率。第二个问题枚举和内部类没有任何关系,enum定义的实际上也是一个类我们可以查看编译后的.class文件有哪些。我感觉enum编译后的class文件的内容和我们使用类实现编译后的.class文件是差不多的。
我觉得你会问出第二个问题可能是看视频的时候有这么一段代码:
enum TrafficLamp{
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
}
,RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},YELLOW(10){
public TrafficLamp nextLamp(){
return RED;
}
};
private int time;
private TrafficLamp(int time){
this.time = time;
}
public abstract TrafficLamp nextLamp();
}
在这里实际上只是在定义枚举的时候使用到了匿名内部类而已。
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
}
这段代码你可以和下面的代码结合起来理解。
abstract class Lamp{
public abstract Lamp nextLamp();
public static Lamp GREEN = new Lamp(){
public Lamp nextLamp() {
// TODO Auto-generated method stub
return null;
}