A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kira 中级黑马   /  2014-3-5 14:19  /  937 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

交通灯项目里面 张老师是设计了几个对象
我在做灯的时候 有几个代码不太理解
代码
  1. public enum Lamp {
  2.         //我们看下12个灯 这里的2代表to  南面 S2N S2W S2E
  3.          // 东面 E2W E2S E2N  
  4.         //北面 N2S N2E N2W
  5.         //西面 W2E W2N W2S
  6.         //我们写下这些灯
  7.        
  8.         //三个属性
  9.         //判断绿灯
  10.         private  boolean lighted=false;//默认不是绿灯
  11.         //记住对面的灯
  12.         private String oppsite ;
  13.         //记住下一个方向的灯
  14.         private String next;
  15.         //定义构造方法
  16.         private Lamp(boolean lighted,String oppsite,String next){
  17.                 this.lighted=lighted;
  18.                 this.oppsite=oppsite;
  19.                 this.next=next;
  20.                
  21.         }
  22.         //灯的方法 灯变绿 灯变绿的时候 对面的等也变绿
  23.         public void light(){
  24.                 this.lighted=true;//正面变绿
  25.                 if(oppsite!=null){//对面也变绿 先判断它存在
  26.                        
  27.                 Lamp lampoppsite =          Lamp.valueOf(oppsite);//枚举的valueOf的方法
  28.                 lampoppsite.light();//绿灯亮
  29.                 }
  30.                
  31.         }
  32.         //定义一个还有绿灯变黑 红灯变红的方法 返回下一个方向变绿的灯
  33.     public Lamp stop(){
  34.             this.lighted=false;//正面变红
  35.             if(oppsite!=null){//对面也变红 先判断它存在
  36.                        
  37.                     Lamp lampoppsite =          Lamp.valueOf(oppsite);//枚举的valueOf的方法
  38.                     lampoppsite.stop();//红灯亮
  39.                     }
  40.             //下一个方向
  41.             Lamp nextLamp =null;
  42.             if(nextLamp!=null){
  43.                     Lamp nextla = Lamp.valueOf(next);//那边切红灯的时候 对面正好是绿灯
  44.                     nextla.light();
  45.                    
  46.             }
  47.     return nextLamp;
  48.     }       


  49. }
复制代码
这里么有几个问题 1 关于灯的枚举中的成员变量private boolean lighted=false;
这里张老师的源代码是private boolean lighte; 没有设定初始值 他是下面又写了一个isLigted方法
  1. public boolean isLighted(){
  2.                 return lighted;
  3.         }
复制代码
返回了一个布尔值 如果我直接初始设为假的话 我在下面直接写一个灯亮的方法 直接改为true 这样省略一个方法是否可行

2  比如枚举的一个实例对象 S2N("N2S","S2W",false) 这个显然是说明南-北的灯 这个没问题 对面就是北到南也没问题
可是 下一个等 为什么就一定是南-西 S2W ?而不是南-东 S2E 这个不理解
3 我上述代码中少写了源代码的
  1. System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
复制代码
之所以这样 是因为我没有看到name 那么这个name究竟定义在哪了呢







评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

9 个回复

正序浏览
1844611785 发表于 2014-3-5 22:49
S2N通的时候,N2S也通,这根本就是一条线路上的,只是看不同的灯

懂了:victory:
回复 使用道具 举报
kira 中级黑马 2014-3-5 22:55:46
9#
戚兴海 发表于 2014-3-5 17:34
这么说吧,S2N和N2S两个完全是一样的,随便考虑哪个都一样,除去4个右转弯的等常绿不说,其他8个方向都是两 ...

已经很清楚了 大神:) 我应该差不多了 我再多看看这块
回复 使用道具 举报
S2N通的时候,N2S也通,这根本就是一条线路上的,只是看不同的灯

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
这么说吧,S2N和N2S两个完全是一样的,随便考虑哪个都一样,除去4个右转弯的等常绿不说,其他8个方向都是两两成对的,
S2N的下一个是S2W,N2S的下一个是N2E,
S2N只要亮了,N2S自然就跟着亮了,同理,下一个等S2W亮了,N2E也就跟着亮了,变红也会跟着变红,所以只要判断一个就可以了。
说的不是很清楚,这个灯的项目在这块很绕。。。希望楼下有大神能说的更透彻一些
回复 使用道具 举报
戚兴海 发表于 2014-3-5 15:52
老师的视频多看几遍都可以了,isLighted在Road类里会用到的,用来判断这个路上的灯的状态。
视频完全看懂 ...

主要是因为交通灯这个项目中 老师的灯以及做的灯的控制器不是现场写的代码 而是以及写好了的代码
来来回回光这个灯就看了好几遍了 就灯那个地方实例对象不太理解 基本差不多了 最后求教一下
为什么S2N判断了之后 N2S就不在判断了呢 多谢啦:lol
回复 使用道具 举报
kira 发表于 2014-3-5 15:44
但是 1 张老师设了个isLighted方法 结果却完全没有用到 这里的易读性可以理解 但是
这个方法设了却完全没 ...

老师的视频多看几遍都可以了,isLighted在Road类里会用到的,用来判断这个路上的灯的状态。
视频完全看懂了再考虑去自己写写看,理解了最重要
回复 使用道具 举报
戚兴海 发表于 2014-3-5 15:20
第一个:
布尔型变量的默认赋值就是false,关于这点,你理解错了老师代码的意思。isLighted只是用来判断相 ...

但是 1 张老师设了个isLighted方法 结果却完全没有用到 这里的易读性可以理解 但是
这个方法设了却完全没有用到 虽然我不知道后面是否用到了这个方法 假如后面也没有用到这个方法 那么这个方法是否有点多余呢 如果出错的话会在什么地方可能出错呢
2 说实话还是有点糊涂:L S2W 关于记住下一方向的灯 我能不能这么理解呢
假如车南-西 我先要经过路中心 南-北 然后拐弯 到西 那么枚举实例对象S2W(false,"N2E","E2W")
实例上下一个方向就是看的东西方向的灯 还有就是 为什么S2N判断了之后 N2S就不在判断了呢
3 这个现在明白了
回复 使用道具 举报
第一个:
布尔型变量的默认赋值就是false,关于这点,你理解错了老师代码的意思。isLighted只是用来判断相应路线上的灯是不是亮的,不是用来改变的。将这个功能独立出来可以提高代码的易读性。按照你那样省略掉这一行意义不是很大,还容易出错。
第二个:这里只考虑S2W是因为这个方向需要通过路的中央,其他线路上的车必须停下了才可以,当然右转弯除外,因为右转弯实际上不影响其他线路的通行,所以这里的右转弯都设置成常绿状态了。
第三个:name()是一个方法,Enum类自带的一个方法,可以返回当前枚举常量的名称,由于每个枚举常量都是一个枚举类的对象,当然可以调用这个方法了。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
还有就是写完这些灯 还有一个不理解:L
  1. W2S(true,null,null),S2E(true,null,null),E2N(true,null,null),N2W(true,null,null),//拐弯方向
  2.         S2N(false,"N2S","S2W"),S2W(false,"N2E","E2W") ,E2W(false,"W2E","E2S"),E2S(false,"W2N","S2N") ,//直方向 只写一个
  3.         N2S(false,null,null),N2E(false,null,null),W2E(false,null,null),W2N(false,null,null);//反方向的忽略不计
复制代码

这个地方 为什么反方向忽略不计它的对面的 及下一次的灯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马