什么是处理java.lang.IllegalArgumentException的最佳方法:没有枚举常量

时间:2019-01-11 14:54:05

标签: java enums

枚举类是这样的:

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);
}

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

您可以执行此操作的一种方法是,在枚举内部显式创建一个静态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"));
    }

}

答案 1 :(得分:1)

您可以使用Streams来更短地处理它:

  • 使用Map作为键保存一个String,并将常数保存为值
  • 查找值或不保留该值
  • 收集所有找到的东西
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]
}

答案 2 :(得分:0)

您可以引入一个静态方法,该方法将为您获取 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);
}