2013-06-18 3 views
2

일부 오래된 코드를 리팩토링하고 문자열 상수를 포함하는 클래스 "태그"를 찾으십시오. 대부분의 XML 태그는 일부 XML-Parser-Handlers에서 사용됩니다. 또한 데이터를 직렬화하기도합니다. 공백으로 정의됩니다.리플렉션에 의한 초기화 문자열 상수

public static String PROXY, NAME, X, Y, KEY, ... CODES;

static { 
    Field[] fields = Tags.class.getFields(); 
    for (int i = 0; i < fields.length; ++i) { 
     try { 
      // init field by its lowercased name 
      String value = fields[i].getName().toLowerCase(); 
      fields[i].set(null, value); 
     } catch (Exception e) { 
      // exception should not occur, because only strings over here. 
      e.printStackTrace(); 
     } 
    } 
} 

이 당신의 의견에 의미가 있습니까 :

자신의 이름으로 초기화? 장점 : 한 곳에서

  • 모든 태그
  • 이름 & 값 (아무 잘못 입력) IDE 자동 완성에 의해
  • 지원 사이
  • 보장 대응

단점 입력 :

  • 을 실제 상수가 아닙니다 (최종적이 아님)
  • 가독성 - 단지 등 "이름은"더 간단 할 문자열 리터럴 "프록시"를 사용하는
  • 반사에 의해 초기화 처리 시간을 소모 - 지연 시작 시간

그래서를 - 유지 또는 리팩터링 하시겠습니까?

+2

아마도 이것을 위해'enum'을 사용하려 할 것입니다. – Pshemo

+0

소년 (Boy)은 ENUM 값과 비슷하게 들립니다. ENUM을 값으로 사용하는 방법을 알아내는 것이 어떻습니까? –

답변

3
이 시도

:

enum Enum { 
    PROXY, NAME, X, Y; 
    public String toString() { 
     return name().toLowerCase(); 
    } 
} 

나이 :

+0

감사합니다, Mikhail! 나는 String을 enum으로 변환했다. 'toString()'을 오버로드하는 것은 좋은 생각이다. – kinnla

4

당신은 열거하여이 상수를 교체하고 여전히 열거 한 장점을 유지할 수 있습니다 : 테스트 value.equals(name().toLowerCase())이 필요하지 않습니다, 위의 코드에서

public enum Tags { 
    PROXY("proxy"), 
    NAME("name"), 
    X("x"), 
    Y("y"); 

    public final String value; 

    private Tags(String value) { 
     this.value = value; 

     if (!value.equals(name().toLowerCase())) { 
      throw new RuntimeException("Value and name do not match"); 
     } 
    } 

    public static void main(String[] args) { 
     for (Tags tag : Tags.values()) { 
      System.out.println(tag + "\t" + tag.value); 
     } 
    } 
} 

을하지만 당신은 오타 오류에 대한 관심을 보일