我们经常要突破枚举编号的限制,自行制定枚举值的编号。对于这种需求,经常会写出下面的代码:
enum WindSpeed implements SerialNoEnum {
LOW(151),
MID(153),
HIGH(155),
STRONG(107),
SUPER_STRONG(156),
AUTO(101);
private final int serialNo;
WindSpeed(int serialNo) {
this.serialNo = serialNo;
}
public int getSerialNo() {
return serialNo;
}
public static WindSpeed valueOf(int serialNo) {
for (WindSpeed item : WindSpeed.values()) {
if (item.serialNo == serialNo) {
return item;
}
}
return null;
}
public static boolean contain(int serialNo) {
for (WindSpeed item : WindSpeed.values()) {
if (item.serialNo == serialNo) {
return true;
}
}
return false;
}
}
这种代码实现其实完全没有问题,但是一旦项目中需要使用大量类似的枚举类型,那么valueOf和contain的方法就会被写上无数次,而且慢慢还会出现各种各样的变种实现。对此,规范代码结构是非常必要的。
初步想到的方式是实现一个接口,提供默认方法,让枚举类型实现接口:
public interface SerialNoEnum {
int getSerialNo();
static <T extends Enum<T> & SerialNoEnum> T valueOf(Class<T> clazz, int serialNo) {
for (T item : clazz.getEnumConstants()) {
if (item.getSerialNo() == serialNo) {
return item;
}
}
return null;
}
static <T extends Enum<T> & SerialNoEnum> boolean contain(Class<T> clazz, int serialNo) {
for (T item : clazz.getEnumConstants()) {
if (item.getSerialNo() == serialNo) {
return true;
}
}
return false;
}
}
修改后的枚举代码:
enum WindSpeed implements SerialNoEnum {
LOW(151),
MID(153),
HIGH(155),
STRONG(107),
SUPER_STRONG(156),
AUTO(101);
private final int serialNo;
WindSpeed(int serialNo) {
this.serialNo = serialNo;
}
@Override
public int getSerialNo() {
return serialNo;
}
}