天天看點

java8 枚舉_java8下 枚舉 通用方法

在項目中經常用到枚舉作為資料字典值和描述的互相轉化。

用法如下:

public enum CommunicationParamsCom {

COM_1(1, "COM1"), COM_2(2, "485端口1"), COM_3(3, "485端口2"), COM_31(31, "載波");

private int value;

private String key;

CommunicationParamsCom(int value, String key) {

this.value = value;

this.key = key;

}

public int getValue() {

return value;

}

public String getKey() {

return key;

}

public static CommunicationParamsCom getEnmuByValue(int value) {

for (CommunicationParamsCom item : values()) {

if (value == item.getValue()) {

return item;

}

}

return null;

}

public static CommunicationParamsCom getEnmuByKey(String key) {

if (StringUtil.isEmpty(key)) {

return null;

}

for (CommunicationParamsCom item : values()) {

if (key.equals(item.getKey())) {

return item;

}

}

return null;

}

}

當枚舉類多了之後,會存在很多重複的值和描述互相轉化的方法,類似getEnmuByValue和getEnmuByKey。

最近找到一種方法,利用接口、接口預設方法、泛型,實作通用的方法。同類型的枚舉隻需要實作該接口即可。

代碼如下:

1 public interfaceICommonEnum {2 intgetValue();3

4 String getKey();5

6 static & ICommonEnum> E getEnmu(Integer value, Classclazz) {7 Objects.requireNonNull(value);8 EnumSet all =EnumSet.allOf(clazz);9 return all.stream().filter(e -> e.getValue() == value).findFirst().orElse(null);10 }11

12 static & ICommonEnum> E getEnmu(String key, Classclazz) {13 Objects.requireNonNull(key);14 EnumSet all =EnumSet.allOf(clazz);15 return all.stream().filter(e -> e.getKey().equals(key)).findFirst().orElse(null);16 }17 }

具體用法:

1 public enum RtuProtocol implementsICommonEnum {2 PTL_A(1, "A規約"), PTL_B(2, "B規約");3

4 private intvalue;5 privateString key;6

7 RtuProtocol(intvalue, String key) {8 this.value =value;9 this.key =key;10 }11

12 public intgetValue() {13 returnvalue;14 }15

16 publicString getKey() {17 returnkey;18 }19 }

轉換時的調用舉例:

RtuProtocol protocol = ICommonEnum.getEnmu(1,RtuProtocol.class)