您的位置:首页 > 职场人生

黑马程序员---java高新技术之枚举

2013-12-08 22:10 393 查看
-------
android培训、java培训、期待与您交流! ----------

枚举

JDK1.5引入了新的类型——枚举。

为什么要有枚举:

问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;

枚举就是要让某个类型的变量的取值只能为固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举的功能。

私有的构造方法

每个元素分别用一个公有的静态成员变量表示

可以有若干个公有的方法或抽象方法,例如,要提供nextDay方法必须是抽象的。

public abstract class WeekDay1 {

privateWeekDay1(){}//私有的构造方法

//公有的静态成员变量,父类的引用指向具体的子类对象

publicfinal static WeekDay1 SUN = new WeekDay1(){//内部类,并且是WeekDay1的子类

//实现WeekDay1中的抽象方法

publicWeekDay1 nextDay() {

returnMON;

}

};

//公有的静态成员变量,父类的引用指向具体的子类对象

publicfinal static WeekDay1 MON = new WeekDay1(){//内部类,并且是WeekDay1的子类

//实现WeekDay1中的抽象方法

publicWeekDay1 nextDay() {

returnSUN;

}

};

//实现WeekDay1中的抽象方法

publicabstract WeekDay1 nextDay();//定义抽象方法

}


枚举的应用

场景1:比较复杂的枚举事例:

enum WeekDay{

SUN {//内部类,继承WeekDay并实现getNetday抽象方法

@Override

WeekDay getNetday() {

//TODO Auto-generatedmethod stub

returnthis.MON;

}

},MON(1) {//创建该枚举实例时会调用带参数的构造函数,对其进行初始化

@Override

WeekDay getNetday() {

//TODO Auto-generatedmethod stub

returnthis.SAT;

}

},SAT {

@Override

WeekDay getNetday() {

//TODO Auto-generatedmethod stub

returnthis.SUN;

}

};

private WeekDay(){}//私有的无参构造函数

private WeekDay(int day){}//私有的有参构造函数

abstract WeekDay getNetday();//枚举中定义一个抽象方法,具体由子类去实现

}

场景2:当枚举中的元素只有一个时,可以当作单例模式来使用

enum WeekDay{

SUN;

private WeekDay(){

System.out.println();

}//私有的无参构造函数

}


1、 在JDK1.5 之前,我们定义常量都是: publicstaticfianl,有了枚举,我们可以定义一个有意义的枚举,元素当作常量来使用,并且是一个集合,表示的意义也就更多,枚举还提供了比常量更多的方法。

//定义一个最简单的枚举,元素有 MON,SUM,THU,

public enum Weekday {

MON,SUM,THU//元素当作常量来使用,通过Weekday.元素名的方式来获取元素,元素是指向本枚举实例的引用

}

2、  使用枚举,能让我们的代码可读性更强。由于枚举是我们主观意识定义的,用来表示生活中的一些集合体,因此枚举本身具备很强的可读性。

enum Signal {

//用枚举来表示交通灯,GREEN表示绿灯, YELLOW表示红灯, RED表示绿灯

GREEN, YELLOW, RED

}

public class TrafficLight {

Signal color = Signal.RED;// color表示当前交通灯的颜色

public void change() {

//结合switch语句,操作起来更加方便

switch (color) {

case RED:

color = Signal.GREEN;//红灯转绿灯

break;

case YELLOW:

color = Signal.RED;//黄灯转红灯

break;

case GREEN:

color = Signal.YELLOW;//绿灯转黄灯

break;

}

}

}


3、在枚举中定义自定义方法,并且必须在枚举实例序列的最后添加分号和定义在枚举实例后面。
publicenumColor {

RED("红色", 1), GREEN("绿色", 2),BLANK("白色", 3),YELLO("黄色", 4);

//成员变量

private Stringname;

privateintindex;

//构造方法

private Color(String name,int index) {

this.name = name;

this.index = index;

}

//普通方法

publicstatic String getName(int index) {

for (Color c : Color.values()) {

if (c.getIndex() == index) {

return c.name;

}

}

returnnull;

}

// get set方法

public String getName() {

returnname;

}

publicvoid setName(String name) {

this.name = name;

}

publicint getIndex() {

returnindex;

}

publicvoid setIndex(int index) {

this.index = index;

}

}

4、  覆盖枚举toString方法。

publicenumColor {

RED,GREEN,YELLO;

//覆盖方法

@Override

public String toString() {

returnthis.index+"_"+this.name;

}

}

5、  实现接口

publicinterfaceBehaviour {

void print();

String getInfo();

}

publicenumColorimplements Behaviour{

RED("红色", 1), GREEN("绿色", 2),BLANK("白色", 3),YELLO("黄色", 4);

//成员变量

private Stringname;

privateintindex;

//构造方法

private Color(String name,int index) {

this.name = name;

this.index = index;

}

//接口方法

@Override

public String getInfo() {

returnthis.name;

}

//接口方法

@Override

publicvoid print() {

System.out.println(this.index+":"+this.name);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: