黑马程序员技术交流社区

标题: 关于枚举的valueOf方法 [打印本页]

作者: 程振    时间: 2012-9-18 20:51
标题: 关于枚举的valueOf方法
本帖最后由 orgcheng 于 2012-9-18 22:19 编辑

今天看了交通灯视频教程,里面使用到枚举的valueOf方法,就下面那个:
  1. public Lamp blackOut(){
  2. this.lighted = false;
  3. if(opposite != null){
  4. Lamp.valueOf(opposite).blackOut();
  5. }

  6. Lamp nextLamp= null;
  7. if(next != null){
  8. // 这里使用了valueOf方法
  9. nextLamp = Lamp.valueOf(next); // <------------------------------------------------------------------
  10. System.out.println("绿灯从" + name() + "-------->切换为" + next);
  11. nextLamp.light();
  12. }
  13. return nextLamp;
  14. }
复制代码
可是j2se的api里只有这个
[td]static <T extends Enum<T>>
T
valueOf(Class<T> enumType, String name)
没有上面使用的那种valueOf方法,想知道它从哪来的?


作者: 武庆东    时间: 2012-9-18 21:22
枚举静态方法valueOf()可以根据枚举类名字获得枚举对象
我没在枚举类中找到这个方法,但是用myeclipse中给出提示,却是是枚举的静态方法~!
作者: 史小兵    时间: 2012-9-18 21:25
Java 的 enum 在设计的时候就尽量在避免与整数值混用在一起,这个设计大大地限制了它的使用场合,比如不能直接把一个 enum 值写入数据库中等,所以 java 中的 enum 一直不被 java 程序员们所喜欢。
其实,即使在 java 的 enum 设计之初,仍然为这种混用的可能性提供了一种模式,不过缺省提供的可混用的数据类型不是整数,而是改成了字符串了。这种模式我称之为value-valueOf模式,在 enum 的设计中是通过两个相对应的函数建立了一种从 enum 到 String 的映射法则。
在 java.lang.Enum (也就是所有 enum 的基类)中提供了两个方法实现了value-valueOf模式:
public final String name();
public static <T extends=Enum<T>
第一个方法把一个枚举的值映射到一个唯一的字符串;第二个方法把一个字符串映射到了一个唯一的枚举值。
在实例的 enum 对象中,第二个方法的 signature 与 java.lang.Enum 中提供的稍微有点不同;
public static XXXEnum valueOf(String name);
使用同样的模式,可以十分方便地把一个枚举与一个整数对应起来,不过这种对应需要实现两个方法来构造value-valueOf模式。
下面给一个简单的例子:
enum Weekday { Monday(1), Tuesday(2), Wednesday(3), Thursday(4), Friday(5), Saturday(6), Sunday(0);
final int _value;
Weekday(int _value) { this._value = _value; } // 把枚举值映射到整数
public int value() { return value; } // 把整数映射到枚举值
public static Weekday valueOf(int value)
{ for(Weekday day : Weekday.values())
{ if(day.value() == value) { return day; } } return null;
}
}
其实,这里的value-valueOf实现了一种可以映射到任意类型的可能性,并且这个模式也并不只有枚举类型才适合使用。




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