簡體   English   中英

什么是處理java.lang.IllegalArgumentException的最佳方法:沒有枚舉常量

[英]What is the best way to handle java.lang.IllegalArgumentException: No enum constant

枚舉類是這樣的:

public enum UserRoles {
    ADMIN, TEST
}

我想處理它,以便如果枚舉中沒有任何值,則不應拋出異常。 我這樣處理:

for(String roleString : roleStrings){
    if(roleString.isEmpty())
        continue;
    UserRoles userRole;
    try {
        userRole = UserRoles.valueOf(roleString);
    } catch(IllegalArgumentException e) {
        continue;
    }
    accountRoles.add(userRole);
}

有更好的方法嗎?

實現此目的的一種方法是,在枚舉內部顯式創建一個靜態HashMap。 如果您期望有很多不匹配的值,則可能會很有用,因為例外通常是(相對)昂貴的操作。 否則,您的工作方式會很好。

import java.util.HashMap;
public class Test {

    public static enum UserRoles {
        ADMIN, USER;

        private static HashMap<String, UserRoles> roles;
        static {
            roles = new HashMap<>();
            for (UserRoles r : UserRoles.values()) {
                roles.put(r.toString(), r);
            }
        }

        public static UserRoles parse(String s) {
            return roles.get(s);
        }
    }

    public static void main(String... args) {
        System.out.println(UserRoles.parse("ADMIN"));
        System.out.println(UserRoles.parse("FOO"));
    }

}

您可以使用Streams以更短的方式處理它:

  • 保存一個以String為鍵,常量為value的Map
  • 尋找價值或不保留那個價值
  • 收集所有你發現的
enum UserRoles {
    ADMIN, TEST;

    static Map<String, UserRoles> map = Arrays.stream(values())
                                              .collect(toMap(Enum::toString, Function.identity()));

    static List<UserRoles> parseAll(List<String> roleStrings) {
        return roleStrings.stream()                      // Stream<String>
                          .map(String::toUpperCase)      // Stream<String>
                          .map(map::get)                 // Stream<UserRoles>
                          .filter(Objects::nonNull)      // Stream<UserRoles>
                          .collect(Collectors.toList()); // List<UserRoles>
    }
}

並用作

public static void main(String[] args) {
    List<String> roleStrings = Arrays.asList("", "ADMIN", "te", "test");
    List<UserRoles> accountRoles = UserRoles.parseAll(roleStrings);
    System.out.println(accountRoles); //[ADMIN, TEST]
}

您可以引入一個靜態方法,如果找到該方法將為您獲取Enum值,否則返回null

enum UserRoles {
    ADMIN, TEST;

    public static UserRoles fetchValue(String constant) {
       return Arrays.stream(UserRoles.values())
                    .filter(e -> e.name().equals(constant))
                    .findFirst()
                    .orElse(null);
    }
}

現在,即使未找到Enum常量,也將返回null而不是引發異常。 如下使用它:

UserRoles userRole = UserRoles.fetchValue(str);
if (userRole != null) {
    accountRoles.add(userRole);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM