1 回答

TA貢獻1804條經驗 獲得超8個贊
MyEnum您可以先從中獲取實例String str,然后使用switchby MyEnum,如下所示:
enum MyEnum {
? ? EMPLOYEE_NUMBER("Employee number"),
? ? FIRST_NAME("First name");
? ? private String desc;
? ? MyEnum(String desc) {
? ? ? ? this.desc = desc;
? ? }
? ? public String getDesc() {
? ? ? ? return desc;
? ? }
? ? public static Optional<MyEnum> fromDesc(String desc) {
? ? ? ? return Stream.of(MyEnum.values()).filter(myEnum -> myEnum.getDesc().equals(desc)).findFirst();
? ? }
}
然后在您的主要代碼中:
Optional<MyEnum> maybeMyEnum = MyEnum.fromDesc(str);
if (maybeMyEnum.isPresent()) {
? ? switch(maybeMyEnum.get()){
? ? ? ? case EMPLOYEE_NUMBER:
? ? ? ? ? ? //setter
? ? ? ? ? ? break;
? ? }
}
UPD 1:
使用Optional.get()andOptional.isPresent()不是最佳實踐 - 這個想法是 - 你必須推遲Optional盡可能多地獲取價值。還Optional.get()違約getter:
Optional.get() 是一個“有吸引力的麻煩事”,對程序員來說誘惑力太大,導致錯誤頻發。人們不希望 getter 拋出異常。
來自JDK-8140281 :(選擇)添加 no-arg orElseThrow() 作為 get() 的首選替代方法
因此,鑒于此,您可以將代碼重寫為:
...
MyEnum.fromDesc(str)
? ? .ifPresent(SomeClass::methodWithSwitchStatement);
...
class SomeClass {
? ? public static void methodWithSwitchStatement(MyEnum myEnum) {
? ? ? ? switch(myEnum){
? ? ? ? ? ? case EMPLOYEE_NUMBER:
? ? ? ? ? ? ? ?//setter
? ? ? ? ? ? ? ?break;
? ? ? ? }
? ? }
}
...
上述代碼中的名稱僅供示例 - 您不應在項目中使用此類名稱。
UPD 2:
這是帶有緩存的版本MyEnum:
enum MyEnum {
? ? EMPLOYEE_NUMBER("Employee number"),
? ? FIRST_NAME("First name");
? ? private static final Map<String, MyEnum> cacheByDesc;
? ? static {
? ? ? ? cacheByDesc = Stream.of(MyEnum.values()).collect(Collectors.toMap(MyEnum::getDesc, e -> e));
? ? }
? ? private String desc;
? ? MyEnum(String desc) {
? ? ? ? this.desc = desc;
? ? }
? ? public String getDesc() {
? ? ? ? return desc;
? ? }
? ? public static Optional<MyEnum> fromDesc(String desc) {
? ? ? ? return Optional.ofNullable(desc)
? ? ? ? ? ? ? ? .map(cacheByDesc::get);
? ? }
}
添加回答
舉報