黑马程序员技术交流社区

标题: 枚举方法问题 [打印本页]

作者: 杨丽静    时间: 2014-1-10 21:11
标题: 枚举方法问题
本帖最后由 杨丽静 于 2014-1-12 11:51 编辑

在交通灯管理系统中的枚举有个地方
public void light()
        {
                this.lighted = true;
                if(opposite != null)
                        Lamp.valueOf(opposite).light();//把枚举的参数给类就可得到对应的枚举对象

         }
Lamp.valueOf(opposite).light();中的valueOf();方法内部是怎么样用的,我怎莫看不懂这个 light()方法啊

求解   求解    求解   求解

作者: 黄晓鑫    时间: 2014-1-10 21:13
代码发全了 不然不好理解
作者: 杨丽静    时间: 2014-1-11 08:07
̅Xcc̲ 发表于 2014-1-10 21:13
代码发全了 不然不好理解

package com.isoftstone.interview.traffic;

public enum Lamp
{
        //(对应的灯,下一个变绿的灯,我的状态)
        //北N  南S  西W  东E
        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 String opposite;//对应的灯
        private String next;//下一个变绿的灯
        private boolean lighted;//我的状态
       
        private Lamp(String opposite,String next,boolean lighted)
        {
                this.opposite = opposite;
                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() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");       
        }
        public Lamp blackOut()
        {
                this.lighted = false;
                if(opposite != null)
                {
                        Lamp.valueOf(opposite).blackOut();
                }
               
                Lamp nextLamp = null;
                if(next != null)
                {
                        nextLamp = Lamp.valueOf(next);
                        System.out.println("绿灯从" + name() + "-------->切换为" + next);                       
                        nextLamp.light();
                }
                return nextLamp;
               
        }
}
作者: tuanjie    时间: 2014-1-11 23:42
在交通灯管理系统中有一个变量lighted,表示交通灯的状态
在light()方法里面,
this.lighted = true; this代表当前对象,当前的交通灯对象,这句代码的意思是把当前的交通灯变为绿灯,
if(opposite != null)
                        Lamp.valueOf(opposite).light();
表示如果当前交通灯有相反方向相对应的交通灯,使用枚举的valueOf方法获得这个交通灯的对象,并变为绿灯
枚举中的valueOf方法,可以根据一个字符串获取和字符串相对应的枚举对象
作者: 杨丽静    时间: 2014-1-11 23:55
tuanjie 发表于 2014-1-11 23:42
在交通灯管理系统中有一个变量lighted,表示交通灯的状态
在light()方法里面,
this.lighted = true; this ...

也就是根据字符内容去找对应的枚举类型吗?那么valueOf内部是怎么实现的
作者: tuanjie    时间: 2014-1-12 09:34
本帖最后由 tuanjie 于 2014-1-12 12:28 编辑
杨丽静 发表于 2014-1-11 23:55
也就是根据字符内容去找对应的枚举类型吗?那么valueOf内部是怎么实现的

具体内部怎么实现的,我也不怎么清楚,在java API中没有valueOf(String arg)方法的介绍,不过可以参考public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name)方法,两个方法实现的效果是一样的。
public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name)

返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)

参数:
enumType - 要从中返回常量的枚举类型的 Class 对象name - 要返回的常量名称
返回:带指定名称的指定枚举类型的枚举常量
抛出:
IllegalArgumentExceptio 如果指定枚举类型不包含指定名称的常量,或者指定类对象不表示枚举类型
NullPointerException  - 如果 enumType 或 name 为空
public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name)的源码:
  1. public static <T extends Enum<T>> T valueOf(Class<T> enumType,
  2.                                                 String name) {
  3.         T result = enumType.enumConstantDirectory().get(name);
  4.         if (result != null)
  5.             return result;
  6.         if (name == null)
  7.             throw new NullPointerException("Name is null");
  8.         throw new IllegalArgumentException(
  9.             "No enum constant " + enumType.getCanonicalName() + "." + name);
  10.     }
复制代码


在交通灯管理系统中:
Lamp.valueOf(opposite).green();同可以使用Lamp.valueOf(Lamp.class,opposite).green();来实现。


作者: 杨丽静    时间: 2014-1-12 11:50
tuanjie 发表于 2014-1-12 09:34
具体内部怎么实现的,我也不怎么清楚,在java API中没有valueOf(String arg)方法的介绍,不过可以参考pub ...

谢谢  我想问的就是这些




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2