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实现了一种可以映射到任意类型的可能性,并且这个模式也并不只有枚举类型才适合使用。 |