黑马程序员技术交流社区
标题:
交通灯系统问题
[打印本页]
作者:
NNERO
时间:
2014-4-20 20:21
标题:
交通灯系统问题
本帖最后由 NNERO 于 2014-4-21 16:02 编辑
public enum Lamp {
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
private boolean lighted;
private String opposite;
private String next;
private Lamp(String oppsite,String next,boolean lighted){//构造方法为何必须私有,我创建公有就报错了。。
this.opposite=oppsite;
this.next=next;
this.lighted=lighted;
}
public boolean isLighted(){
return lighted;
}
public void light(){
this.lighted=true;
if(opposite!=null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+"...."+"Green"+"有6个方向车正在行驶");
}
public Lamp black(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).black();
}
Lamp lampNext = null;//这里是为何,看视频没看懂,为何要拿出来
if(next!=null){
lampNext =Lamp.valueOf(next);
System.out.println("Green"+name()+"------->"+next);
lampNext.light();
}
return lampNext;
}
}
复制代码
注释里的2个问题,求高手解答!!!!
作者:
の放下执著
时间:
2014-4-20 20:38
本帖最后由 の放下执著 于 2014-4-20 20:41 编辑
问题1:
其实枚举是一种特殊的类,这种类的实例对象只能是若干个固定值中的一个,这些固定值可以在枚举的内部指定,外部是不能创建枚举的实例对象的,注意,外部不能创建!所以构造函数必须私有化。
单例也是一种特殊的枚举,想想单例的设计模式也许更有助于理解这个问题。
问题2:Lamp lampNext = null;//这里是为何,看视频没看懂,为何要拿出来
你是说为何lampNext不能定义在if语句中吧?当定义在if语句中时,lampNext对象的作用域只是在{}内,也就是说执行完{}之后内存中就释放掉lampNext了,局部变量的作用域问题。
作者:
展展
时间:
2014-4-21 00:03
本帖最后由 展展 于 2014-4-21 00:04 编辑
我也来回答一下,我就说第二个问题吧
Lamp lampNext = null
这个是用来接受下一个灯的实例对象的,然后便于把它return出去。
return到控制灯--LampComtroller类里,这个类不是有句currentLamp=currentLamp.blackOut();
这里的设计很妙的,
先初始化S2N的路线,让它跑起来,10S后,关闭它,将next灯返回来给currentLamp再过10s next关闭,在返回下一个next灯。还有,Lamp类中的枚举那四个关键路口,一直在打转,可以说这里的设计很妙啊
作者:
tjsyj
时间:
2014-4-21 00:08
第一个问题 :
private Lamp(String oppsite,String next,boolean lighted){//构造方法为何必须私有,我创建公有就报错了。。
这是枚举类的基本要求,所以构造函数必须私有化。 建议你多看几遍张孝祥 老师的高新技术
第二个问题
Lamp lampNext = null;//这里是为何,看视频没看懂,为何要拿出来
作用于问题 ,如果你不拿出来的话 return lampNext; 就会报错 。如果放到 if语句里面 只对 if语句的作用域范围内有用。
作者:
hhmm665544
时间:
2014-4-21 00:19
问题一:枚举是一个特殊的类,构造函数必须私有化,即使通过反射技术,也不能在类外面new出一个新对象.
问题二:因为这个black()方法会返回lampNext,如果你定义在if语句里面,lampNext的生命周期就只在if{}里面,
所以必须定义在if{}外面
作者:
NNERO
时间:
2014-4-21 16:02
了解了,谢谢大家
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2