黑马程序员技术交流社区

标题: 交通灯系统问题 [打印本页]

作者: NNERO    时间: 2014-4-20 20:21
标题: 交通灯系统问题
本帖最后由 NNERO 于 2014-4-21 16:02 编辑
  1. public enum Lamp {

  2.         S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
  3.         N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
  4.         S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
  5.         
  6.         private boolean lighted;
  7.         private String opposite;
  8.         private String next;
  9.         
  10.         private Lamp(String oppsite,String next,boolean lighted){//构造方法为何必须私有,我创建公有就报错了。。
  11.                 this.opposite=oppsite;
  12.                 this.next=next;
  13.                 this.lighted=lighted;
  14.         }

  15.         
  16.         public boolean isLighted(){
  17.                 return lighted;
  18.         }
  19.         
  20.         public void light(){
  21.                 this.lighted=true;
  22.                 if(opposite!=null){
  23.                         Lamp.valueOf(opposite).light();
  24.                 }
  25.                 System.out.println(name()+"...."+"Green"+"有6个方向车正在行驶");
  26.         }
  27.         
  28.         public Lamp black(){
  29.                 this.lighted=false;
  30.                 if(opposite!=null){
  31.                         Lamp.valueOf(opposite).black();
  32.                 }
  33.                 Lamp lampNext = null;//这里是为何,看视频没看懂,为何要拿出来
  34.                 if(next!=null){
  35.                         lampNext =Lamp.valueOf(next);
  36.                         System.out.println("Green"+name()+"------->"+next);
  37.                         lampNext.light();
  38.                 }
  39.                 return lampNext;
  40.         }
  41. }
复制代码
注释里的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