2016-12-31 3 views
2

지도의 키 집합을 내 열거 형으로 검증해야하는지도가 있습니다. enum을 사용하여지도의 키 집합을 확인하는 우아한 방법은 무엇입니까?

public enum Tag { 
    rename, duplicate, process, limit, encode, decode; 
    }; 

지금지도의 keyset 위에서 열거의 값을 가져야한다 : 아래 그림과 같이 내가 열거 클래스가 있습니다. 내 키 집합에 열거 형에없는 값이 들어 있으면 IllegalArgumentException 값을 내 열거 형에서 누락시키고 싶습니다.

다음은 내 코드입니다 :

public Processor(Map<String, String> tasks) { 
    Set<String> keyset = tasks.keySet(); 
    for (String tag : keyset) 
     checkArgument(!EnumUtils.isValidEnum(Tag.class, tag), "unknown tag found '%s'.", tag); 
    } 

당신은 내가 keyset을 반복하고 Preconditions.checkArgument 검사를하고있는 중이 야 볼 수 있듯이. 그것이 없다면 IllegalArgumentException을 던질 것입니다. 그래도 메시지를 던지면 개선 될 수 있다고 확신합니다.

내 질문은 : 내가하고있는 것과 똑같은 일을하는 더 좋은 방법이 있습니까? 확인을 위해 for 루프의 keyset을 반복해야합니까? 또는 하나의 라이너 또는이 유효성 검사를 수행하는 다른 더 좋은 방법이 있습니까?

Java7을 사용하고 있습니다.

+1

지도에'Tag' 열거 형의 키를 넣고 싶다면 정말 Map 이 ​​아니어야합니다. – user2357112

+1

그냥'Map '을 사용 하시겠습니까? EnumMap이라 할지라도? – chrylis

답변

6

너무 많은 일을하고 있습니다. 현실적으로 말하면지도에서 키를 Tag에 묶기 만하면됩니다.

public Processor(Map<Tag, String> tasks) { 
    // processor logic  
} 

보장전달 된 맵의 키는Tag 수있다. 유효하지 않은 키가 전달되면 코드가 컴파일되지 않으므로이 체계에서 예외가 필요하지 않습니다. 또한 열거 형이므로 열거 형에없는 키를 얻지는 않습니다.

문자열 목록을 처리 중이고 열거 형을 직접 가져올 수없는 경우 Tag.valueOf("<string value here>")을 사용하여 변환 할 수 있습니다.

+0

사용자가 IllegalArgumentException을 throw하려고합니다. 코드에서 throw되는 위치는 어디입니까? – prashant

+1

@prashant 당신은 그것을 던질 필요가 없습니다. 이렇게하면 런타임 검사가 아닌 맵에 컴파일 시간 검사가 제공됩니다. 우리는 당신의 대답에서 이것을 이미 해싱 해 왔으며, 여기서 그것을 재탕 할 이유가 없다. – Makoto

+0

하지만 사용자가 @Makoto를 던지고 싶어합니다 ... 그런 사건을 추적하고자하는 비즈니스 사례가 될 수 있습니다 ..... – prashant