我们经常要突破枚举编号的限制,自行制定枚举值的编号。对于这种需求,经常会写出下面的代码:
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;}@Overridepublic int getSerialNo() {return serialNo;}}
