2009-07-29 6 views
5

우리 프로젝트 전체에 우리는 이런 종류의 열거 형을 가지고 있습니다. 그들은 잘 작동하지만 우리는 그들에 대해 확신하지 못합니다.이 정확한 열거 형입니까?

특히 getDocumentType (String) 메소드 사용.

모든 열거 형 필드에서 반복을 피할 수있는 방법이 있습니까?

public enum DocumentType { 

    UNKNOWN("Unknown"), 
    ANY("Any"), 
    ASSET(Asset.class.getSimpleName()), 
    MEDIA(Media.class.getSimpleName()), 
    MEDIA35MM(Media.class.getSimpleName() + " 35mm"); 


    private String label; 

    private DocumentType(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public static DocumentType getDocumentType(String label){ 
     for(DocumentType documentType : DocumentType.values()){ 
      if(documentType.getLabel().equals(label)){ 
       return documentType; 
      } 
     } 
     return UNKNOWN; 
    } 
} 

편집 : newacct 응답을 확인하십시오. 그녀는 괜찮아.

+1

레이블의 정적지도를 열거 형 인스턴스에 저장하는 것이 좋지만, 좌절감에 따라 자바에서는 열거 형 생성자에서 정적 필드를 참조 할 수 없습니다. – skaffman

+1

"Asset"을 작성하는 대신 Asset.class.getSimpleName()을 사용하는 이유는 무엇입니까? 리팩터링을 통해 이름을 변경 하시겠습니까? – akarnokd

+1

문자열 대신 클래스 리터럴을 사용하는 것이 항상 좋은 습관입니까? – skaffman

답변

5

열거 형을 작성하는 데 제한이 있으므로 어딘가에서 반복해야 할 것입니다. 이상적인 세계에서는 DocumentType의 생성자 내에서 정적 Map을 채우지 만 이는 허용되지 않습니다.

나는 조회 테이블의 열거를 static 초기화 번 반복을 수행하고, 저장하고 제안 할 수있는 가장 좋은 :

public enum DocumentType { 

    .... existing enum stuff here 

    private static final Map<String, DocumentType> typesByLabel = new HashMap<String, DocumentType>(); 
    static { 
     for(DocumentType documentType : DocumentType.values()){ 
      typesByLabel.put(documentType.label, documentType); 
     } 
    } 

    public static DocumentType getDocumentType(String label){ 
     if (typesByLabel.containsKey(label)) { 
      return typesByLabel.get(label); 
     } else { 
      return UNKNOWN; 
     } 
    } 
} 

은 적어도 당신은 내가하지만, 반복 할 때마다 일을하지 않습니다 의미있는 성능 향상을 보게 될지 의심됩니다.

public enum DocumentType { Unknown, Any, Asset, Media, Media35mm } 

을 다음 .valueOf()하여 얻을 : 문자열이 컴파일시에 알려져 있으며, 그들이 올바른 식별자가있는 경우, 당신은 단지 직접 열거 형의 이름으로 사용할 수있는 경우

+0

+1 내가 생각했던 것, 당신은 나를 이겼어. =) – mikek

+1

방금 ​​컴파일러에서 10 분 정도 고함을지었습니다 – skaffman

+0

열거 형에 요소가 100 개 (또는 심지어 수천 개)있는 경우 성능이 향상 될 수 있습니다 ...아마도 당신이 이것을 많이 보았을 지 모른다. – aperkins

1

제가 아는 한 (그것이 가치있는 것이 무엇인지), 그것은 당신이 원하는 것을하는 가장 좋은 방법입니다.

내가 그렇게하는 방법입니다.

당신의 enum 수가 크게 증가하면 (몇 백 - 천) 조금 더 빠른 룩업을 할 enumsStringsMap ING를 추가 할 수 있습니다. 그러나 소량의 eunums에 대해, 이것은 과도 할 수 있습니다.

1

나에게 잘 보입니다.

나는 그대로 반복 할 것입니다. 물론 < 'label', 'DocumentType'> 구현을 enum 클래스에 추가하고 조회를 수행 할 수 있지만 성능이 크게 향상되지는 않습니다.

1

. 예를 들어,

+0

동료가 같은 해결책을 찾고있었습니다. 우리의 정확한 경우가 아니라 대부분의 경우에 문제가되지 않지만, 다음 반복을 위해 식별자와 레이블을 정말로 희생하는지 확인합니다. –

관련 문제