枚举 ValueOf 空检查和异常处理
Enum ValueOf null check & exception handling
我正在尝试优化下面的代码,我想看看是否有办法避免抛出两次异常并将其优化为只抛出一次。有什么建议吗?
User 是一个枚举,如果没有找到值,valueOf 方法将抛出 IllegalArgumentException,同时我还必须在此处进行 null 检查,从而再次检查 isBlank。
private UserContext getContext(String name) {
UserContext context = null;
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("name cannot be Null or empty");
}
try {
context = map.get(User.valueOf(name.toUpperCase()));
}catch(IllegalArgumentException e) {
throw new IllegalArgumentException("name is not in the list of given names" +name);
}
return context;
}
最好将验证 User
枚举的名称的逻辑移动到 User
枚举内的静态方法中。
此外,null/empty 的检查似乎是多余的,可能会被完全删除。
public enum User {
// ... existing code
public static User byName(String name) {
// this check may be removed completely
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("name cannot be null or empty");
}
return Arrays.stream(User.values())
.filter(v -> v.name().equalsIgnoreCase(name)) // null-safe case insensitive check
.findFirst() // Optional<User>
.orElseThrow(() -> new IllegalArgumentException("name is not in the list of given names: " + name));
}
}
然后方法 getContext
可以重构为简单如下:
private UserContext getContext(String name) {
return map.get(User.byName(name));
}
我正在尝试优化下面的代码,我想看看是否有办法避免抛出两次异常并将其优化为只抛出一次。有什么建议吗?
User 是一个枚举,如果没有找到值,valueOf 方法将抛出 IllegalArgumentException,同时我还必须在此处进行 null 检查,从而再次检查 isBlank。
private UserContext getContext(String name) {
UserContext context = null;
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("name cannot be Null or empty");
}
try {
context = map.get(User.valueOf(name.toUpperCase()));
}catch(IllegalArgumentException e) {
throw new IllegalArgumentException("name is not in the list of given names" +name);
}
return context;
}
最好将验证 User
枚举的名称的逻辑移动到 User
枚举内的静态方法中。
此外,null/empty 的检查似乎是多余的,可能会被完全删除。
public enum User {
// ... existing code
public static User byName(String name) {
// this check may be removed completely
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("name cannot be null or empty");
}
return Arrays.stream(User.values())
.filter(v -> v.name().equalsIgnoreCase(name)) // null-safe case insensitive check
.findFirst() // Optional<User>
.orElseThrow(() -> new IllegalArgumentException("name is not in the list of given names: " + name));
}
}
然后方法 getContext
可以重构为简单如下:
private UserContext getContext(String name) {
return map.get(User.byName(name));
}