2016-08-22 2 views
1

내가 자바 6을 사용하고 자바에서 작업하지 않고 내 응용 프로그램이 거대하고 그것의 6 이제 우리는 자바 버전으로 7valueOf() 열거의 방법은 7

를 업그레이드하려고 자바 개발 그러나 때 내가 자바 7 그것을 열거 클래스에서 컴파일 오류를 줄 것이다 그것을 시도했다. enum 클래스에서 나는 자바 7에서 valueOf() 메서드를 정의 했으므로 컴파일 오류가 발생합니다.

코드

public enum TestEnum { 
TESTONE,TESTTWO, NONE; 

public String toString() { 
    switch(this) { 
     case TESTONE: 
      return "Test one"; 
     case TESTTWO: 
      return "Test two"; 
     case NONE: 
      return "None"; 
    } 
    return null; 
}; 

public static TestEnum valueOf(Class<TestEnum> enumType, String value){ 

     if(value.equalsIgnoreCase(TESTONE.toString())) 
      return TestEnum.TESTONE; 
     else if(value.equalsIgnoreCase(TESTTWO.toString())) 
      return TestEnum.TESTTWO; 
     else if(value.equalsIgnoreCase(NONE.toString())) 
      return TestEnum.NONE; 
     else 
      return null; 
    } 
} 

오류 (해결)

Name clash: The method valueOf(Class<TestEnum>, String) of type TestEnum has the 
same erasure as valueOf(Class<T>, String) of type Enum<E> but does not hide it TestEnum.java 

업데이트

내가 valueOf() 메소드를 변경하고 내 파일을 컴파일합니다.

public static TestEnum valueOf(TestEnum enumType, String value){ 

     if(value.equalsIgnoreCase(TESTONE.toString())) 
      return TestEnum.TESTONE; 
     else if(value.equalsIgnoreCase(TESTTWO.toString())) 
      return TestEnum.TESTTWO; 
     else if(value.equalsIgnoreCase(NONE.toString())) 
      return TestEnum.NONE; 
     else 
      return null; 
    } 
+2

의'클래스 가'매개 변수가 사용되지;

마찬가지로, 당신은 명시 적으로 문자열 값을 테스트보다 더 잘 할 수 그 유형의 유일한 클래스는'TestEnum.class'이기 때문에 다른 클래스의 경우 중복됩니다. –

+1

이 코드는 TestEnum에'error : name clash : valueOf (Class , String) 그리고 열거 형에서 valueOf (Class , 문자열)가 같은 소거를 갖지만'-source 1.6'으로 컴파일 될 때 다른 것을 숨기지 않습니다. – EJP

+0

@AndyTurner 덕분에 Class <>와 그 작업을 제거했습니다. –

답변

1

모든 열거 형은 Enum<T>의 하위 클래스입니다. Enum<T>은 이미 지우기 valueOf(Class,String)이있는 정적 메소드를 정의합니다. 정적 메서드를 재정의 할 수 없으므로 같은 서명으로 정적 메서드를 정의 할 수 없습니다. 방법을 다르게 호출해야합니다.

6

Java 6에서 작동하는 이유는 확실하지 않습니다. [이전에 Java 6에있는 해당 서명이있는 메소드] (https://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#valueOf(java.lang.Class, Java).

그러나 개발자의 건전성을 위해 어쨌든 메서드 이름을 바꾸는 것이 좋습니다. Enum.valueOf 뭔가 잘 알려져 있으며 뭔가 다른 방법을 제공하려고 시도하고 있습니다. 이것은 최소한의 놀라움의 원칙을 위반하고 의도하지 않은 결과를 초래할 가능성이 있습니다.

TestEnum.forName(String)과 같은 이름은 가능한 대안입니다.


또한 : 그 ENUM의 형식의 변수 위에 열거의 switch는 코드 냄새의 비트이다. 당신은 더 잘 열거를 표현할 수있다 : 당신이 실수로 추가 더 열거 값의 "문자열"양식을 생략 할 수 없다는 추가적인 장점이있다

enum TestEnum { 
    TESTONE("Test one"),TESTTWO("Test two"), NONE("None"); 

    private String str; 

    private TestEnum(String str) { 
    this.str = str; 
    } 

    @Override public String toString() { 
    return str; 
    } 
} 

합니다. 우선

enum TestEnum { 
    /* values */; 

    private static HashMap<String, TestEnum> forNameMapping; 
    { 
    forNameMapping = new HashMap<>(); 
    for (TestEnum t : TestEnum.values()) { 
     forNameMapping.put(t.str.toLowerCase(), t); 
    } 
    } 

    public static TestEnum forName(String str) { 
    return forNameMapping.get(str.toLowerCase()); 
    } 
} 
관련 문제