이 열거 형이 있습니다.
public enum Role {
Manager("manager"),
Customer("customer");
private String role;
Role(String role){
this.role = role;
}
}
그리고 나는 Http 요청 (Jerey와 Jackson 사용)에서 얻은 POJO를 가지고 있습니다.
public class UserCredentials {
private String username;
private String password;
private Role role;
public UserCredentials() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
마지막 setter는 Jackson이 변환 방법을 실제로 모르기 때문에 오류를 생성합니다.
{
"username": "shikloshi",
"password": "password",
"role": "admin"
}
개체 (특히 "role"Enum)에.
세터를 다음과 같이 변경하려고했습니다.
public void setRole(String role) {
this.role = new Role(role);
}
할 수 없습니다.
더 많은 객체 지향 방식으로 enum 생성자 (또는 다른 생성 방법 (예 : Jackson))를 호출하는 방법이 있습니까 (대안은 setter 내부에서 switch-case를 사용하는 것입니다)?
이 상황에서 일반적인 해결책 public static Role fromString(String)
은 Role
열거 형에 메서드 를 추가하는 것입니다 . 내부적으로 switch
, 또는 Map<String, Role>
캐시를 사용할 수 있습니다 .
간단한 사용 예 switch
:
public static Role fromString(String string) {
switch (string) {
case "manager": return Manager;
case "customer": return Customer;
}
throw new IllegalArgumentException("Invalid role: " + string);
}
캐시를 사용하는 예 :
private static Map<String, Role> cache = new HashMap<>();
static {
for (Role value : values()) {
cache.put(value.role, value);
}
}
public static Role fromString(String string) {
Role role = cache.get(string);
if (role == null) {
throw new IllegalArgumentException("Invalid role: " + string);
}
return role;
}
사실, 같은 @realskeptic은 당신이 당신의 이름을 변경 한 경우 댓글에서 지적 enum
모두 대문자로 값을 MANAGER
, CUSTOMER
규칙에서 권장하는대로, 당신은 혜택을 누릴 수있는 .valueOf
무대 뒤에서 캐시를 사용하는 방법 :
public static Role fromString(String string) {
return valueOf(string.toUpperCase());
}
이 경우 캐시를 직접 구축하는 것에 대해 걱정할 필요가 없습니다. 유효하지 않은 문자열 값을 제공하면 IllegalArgumentException
위의 예와 같이 (약간 다른 텍스트로)이 발생합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다