java利用构造类来模拟交通灯_Java5新特性之枚举

本文介绍了Java中的枚举类型,阐述了枚举的作用和优势,通过实例详细讲解了如何使用枚举来模拟交通灯,包括基本使用、带有构造方法的枚举以及带有抽象方法的枚举。枚举可以限制变量的取值,提高代码的健壮性,同时避免了运行时的非法类型值错误。
摘要由CSDN通过智能技术生成

1.概念

首先,枚举并不是一种新技术,而是一种基础数据类型.它隶属于两种基础类型中的值类型,如下:

7bd5474c2adb7076c283ed37906be656.png

2.为什么要有枚举

枚举在真正的开发中是非常常用的,它的作用很简单也很纯粹:它定义了一种规范,就是要让某个类型的变量的取值只能为若干个固定值中的一个,也就是要符合它定义的规范.它可以让编译器在编译时就可以识别程序中填写的非法值,一定程度上防止了运行时的非法类型值错误.

例如:要定义星期几的变量,如果用普通变量1-7   分别表示星期一到星期日,但有人可能写成int weekday=0.这种错误只能到运行时才能发现,编译是没问题的。但如果用枚举代替普通变量,就可将错误在编译时识别。

枚举本身当然是一个类,它的定义与使用与普通类很类似,而每个枚举变量都相当于类的一个对象。下面将分别介绍枚举的基本使用、带有构造方法的枚举、带有抽象方法的枚举。如下:

3.  基本使用

实例:

public class EnumTest2 {

public static void main(String[] args) {

WeekDay weekDay2 = WeekDay.FRI;

//使用1:toString()方法

System.out.println(weekDay2);//输出:FRI

//使用2:name()方法

System.out.println(weekDay2.name());//输出:FRI

//使用3:ordinal()方法

System.out.println(weekDay2.ordinal());//输出:5

//使用4:枚举变量的反射

System.out.println(WeekDay.valueOf("SUN").toString());//输出:SUN

//使用5:获取枚举的长度

System.out.println(WeekDay.values().length);//输出:7

}

/**

* 定义枚举类--这里作为测试类的一个子类

*/

public enum WeekDay{

SUN,MON,TUE,WED,THI,FRI,SAT;

}

}

4.  带有构造方法的枚举

首先有两点要求:

?  要求所有的东西都要在枚举变量之后写

?  构造方法必须是私有的

使用:

?  当使用某一个枚举变量时,就会将所有的枚举变量都实例化并缓存;以后再次用到时不会再次实例化。

?  与普通类一样,枚举变量采用哪一个构造方法,也是根据参数的类型与个数而定。

实例:

public class EnumTest {

public static void main(String[] args) {

WeekDay weekDay = WeekDay.MON;

System.out.println("-------------");

WeekDay weekDay2 = WeekDay.TUE;

/*

* 输出结果如下:

构造方法3

构造方法2

构造方法1

构造方法1

构造方法1

构造方法1

构造方法1

-------------(结束)

* 上面调用MON时,所有的枚举变量的构造方法都被调用;再次调用TUE时没有再调用

* 表明,当使用某一个枚举变量时,就会将所有的枚举变量都实例化并缓存;

* 以后再次用到时不会再次实例化

*/

}

/**

* 定义枚举类--这里作为测试类的一个子类

*/

public enum WeekDay{

//与普通类一样,枚举变量采用哪一个构造方法,也是根据参数的类型与个数而定

//如下SUN将采用构造方法3;MON采用构造方法2;其余的都采用构造方法1

SUN(1,2),MON(1),TUE(),WED,THI,FRI,SAT;

//构造方法1:

private WeekDay(){System.out.println("构造方法1");}

//构造方法2

private WeekDay(int day){System.out.println("构造方法2");}

//构造方法3

private WeekDay(int day,int day2){System.out.println("构造方法3");}

}

5.  带有抽象方法的枚举

枚举类中的逻辑方法,肯定会涉及到所有的枚举变量,要进行逻辑判断就必须要使用大量的if…else语句。而使用抽象方法就可以将if…else语句转移成一个个独立的类。

如,下面的交通灯枚举类中,若要计算下一个灯的颜色,普通的写法肯定要判断,如果当前“红灯”那么下一个灯为“绿灯”;如果当前为“绿灯”那么下一个灯为“黄灯”……;而如果使用抽象方法则可将一系列判断转移为一个个独立的类。实例:

/**

* 定义枚举类

*/

public enum TrafficLamp{

//"{}"表示一个匿名子类,所以就可以重写枚举的抽象方法。这里将if..else转化为了3个匿名子类

RED(30){

public TrafficLamp nextLamp(){

return GREEN;

}

},

GREEN(45){

public TrafficLamp nextLamp(){

return YELLOW;

}

},

YELLOW(5){

public TrafficLamp nextLamp(){

return RED;

}

};

//抽象方法-计算下一个灯的颜色

public abstract TrafficLamp nextLamp();

private int time;//定义交通灯的持续时间

private TrafficLamp(int time){this.time = time;}//构造方法

}

6.  普通类模拟枚举类

下面简单用普通类来模拟一下枚举类

要素:

?  私有的构造方法

?  用一个个公有的静态成员变量模拟枚举变量

?  可以有若干公有方法或

实例:

package TestPage;

public abstract class WeekDay {

//?私有的构造方法

private WeekDay(){}

//?公有的静态成员变量SUN、MON模拟枚举变量,"{}"表示一个匿名子类

public final static WeekDay SUN = new WeekDay(){

@Override

public WeekDay nextDay() {

return MON;

}

};

public final static WeekDay MON = new WeekDay(){

@Override

public WeekDay nextDay() {

return SUN;

}

};

// 抽象方法-转移计算nextDay的逻辑

public abstract WeekDay nextDay();

//普通的计算nextDay的方法,要用if...else判断

/*public WeekDay nextDay(){

if(this == SUN){

return MON;

}else{

return SUN;

}

}

*/

//公有方法

public String toString(){

return this==SUN?"SUN":"MON";

}

}

7.  总结

枚举是一个较特殊的“类”,枚举变量相当于枚举类的一个个对象。它定义一种规范,让枚举变量的取值必须符合它定义的规范,只能为若干个固定值中的一个,从而在一定程度上防止了运行时的非法类型值错误.

原文:http://blog.csdn.net/wang379275614/article/details/39652245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值