黑马程序员—(基础加强JDK1.5)—枚举部分

来源:互联网 发布:最好的优化手机软件 编辑:程序博客网 时间:2024/05/22 03:05
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
枚举部分知识总结及应用
1、枚举的作用

       有些时候我们为了代码的安全性,会对我们所建立的类的实例对象会有特殊的限制要求,比如红绿灯类,显然我们只能拥有3种颜色,而不是可以任意建立具有各自特色的实例对象,显然我们给改成霓虹灯是不行的。

 下面我们来举一个在JDK1.5之前来表示红绿灯例子:

class TrafficLights{//建立交通灯类private String color;//为灯的颜色设立私有属性public void setColor(String color){//为颜色属性传值this.color=color;}public String getColor(){//返回颜色属性return this.color;}public TrafficLights(String color){this.setColor(color);}public static final TrafficLights red=new TrafficLights("红灯");//建立不可更改三种灯颜色public static final TrafficLights yellow=new TrafficLights("黄灯");public static final TrafficLights green=new TrafficLights("绿灯");public static TrafficLights getInstance(int i){//取得灯类,颜色范围固定switch(i){case 1:{return red;}case 2:{return yellow;}case 3:{return green;}default:{return null;}}}}public class Text1{public static void main(String[] args){TrafficLights color1=TrafficLights.red;//通过类名直接取得红灯TrafficLights color2=TrafficLights.getInstance(2);//通过编号取得黄灯System.out.println(color1.getColor()+" "+color2.getColor());//将其颜色属性打印输出}}

        以上为一个反映红绿灯部分特性的类(注意看这里不是红绿灯的应用类),主要表现其在建立实例对象的时候的选择限制,比如通过以上条件的限制,我们是建立不出蓝灯的。
        简单的介绍下枚举,枚举的实现是通过关键字enum来实现的,通过API可以查到enum是一个属于java.lang包的类,但是它与一般的类有些不同,我们来看看声明枚举类型的格式:
public enum 枚举类名称{
枚举元素1,枚举元素2,枚举元素3……
}
你们是否发现到enum替代了class的位置呢?后面接的才是枚举类名。
下面我们来通过枚举实现上面的代码功能:

enum TrafficLights{//我们建立一个匿名的内部类来调用TrafficLights类的构造方法,在内部实现其下一个灯的返回方法。red(30){public TrafficLights nextLight(){return green;}},green(45){public TrafficLights nextLight(){return yellow;}},yellow(5){public TrafficLights nextLight(){return red;}};private final int time;TrafficLights(int time){//设定构造方法为各个灯亮的时间传值this.time=time;}public abstract TrafficLights nextLight();//定义抽象方法,返回下一个灯public int getTime() {return time;}}public class Text1{//此类在这里不作为实际功能的调用,仅仅是特性的测试public static void main(String[] args){System.out.println(TrafficLights.red.nextLight());System.out.println(TrafficLights.red.getTime());System.out.println(TrafficLights.green.getTime());}}

运行结果:

green

30

45

      之前的例子更像是一个带有自身颜色属性的三个灯,而没有体现其交通指挥的作用,而在这个例子中,显然靠谱了一些。在这里,我们没有设定setTime()方法,而是在时间的设定上,给予的final的附加,以配合用实例对象时间属性,就是为了在测试类中,我们将无法修改它,为其作一个限定。由此可见final后的属性如果还没有赋值的话,如:

final int a;//设定被final修饰的变量a,笔者曾经以为这里会有一个为空的默认值,担心之后就不能赋值了,而实际上在这里a并没有被初始化,所以不能被调用的

a=10;//可以接受第一次赋值

 a++;//这里就会报错了

        大家可以发现上面的最后一段代码虽然篇幅较短,但结构相对复杂了很多,其修改自张孝祥老师的枚举例子,本人也是写不出来的,不过勉强能够理解了,欢迎大家一起交流。


---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击