2010-11-25 2 views
6

나는자바 열거 형 : 리팩토링 switch 문 '상수 표현식 필요'컴파일 오류?

private static Object getValue(String stringValue, Parameter parameter) throws InvalidPatternException 
{ 
    Object result=null; 
    switch (parameter.getDataType()) 
    { 
     case GroupConstants.STRING_VALUE: // String value 
      result=stringValue; 
     break; 
     case GroupConstants.INTEGER_VALUE: // Long value 
     case GroupConstants.LONG_VALUE: 
     case GroupConstants.BOOLEAN_VALUE: 
     case GroupConstants.DATE_VALUE: 
.. 
} 

나는 INT 상수 값을 리팩토링 할이 열거

에 의해 표현되는 스위치 문장의 집합이 코드에서 내 응용 프로그램

public class GroupConstants { 
    .. 
    public static final int INTEGER_VALUE = 1; 
    public static final int LONG_VALUE = 2; 
    public static final int STRING_VALUE = 3; 
    .. 
} 

에 대한 상수를 선언하는 클래스를 가지고

public enum DataType { 

    UNKNOWN_VALUE(0,"unknown"), 
    INTEGER_VALUE(1,"integer"), 
    LONG_VALUE(2,"long"), 
    STRING_VALUE(3,"string"), 
    BOOLEAN_VALUE(4,"boolean"), 
.. 
} 

그래서 내 코드는 다음과

01처럼 보일 수 있습니다

초과 근무로 인해 내 스위치 명령문을 변경할 수 있습니다. 열거를 가리 키도록 정적 최종 int 참조를 변경하면 모든 switch 문이 중단됩니다.

[javac] /home/assure/projects/tp/main/src/a/b/c/DDDDDManagerBean.java:1108: constant expression required 
[javac]    case GroupConstants.INTEGER_VALUE: 
[javac]        ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:203: constant expression required 
[javac]   case GroupConstants.INTEGER_VALUE: 
[javac]       ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:268: constant expression required 
[javac]    case GroupConstants.INTEGER_VALUE: 
[javac]        ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:316: constant expression required 
[javac]    case GroupConstants.INTEGER_VALUE: 
[javac]        ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:436: constant expression required 
[javac]   case GroupConstants.INTEGER_VALUE: 

모든 스위치를 아직 변경하지 않으려 고하고 싶지 않으므로 깨끗한 해결 방법이 있습니까?

+0

가 아닌 GroupConstants 기존의 방법은? DataType.INTEGER_VALUE : 컴파일러 오류에 있어야합니까? –

+0

지금까지 보여준 내용에 따라 문제가 무엇인지 알 수 없습니다. 이 작업은 예를 들어 내가하고있는 것으로 가정합니다. 'ParameterComponent'. 그러나 다시, 오류 메시지는 새로운'DataType' 클래스와 아무런 관련이 없습니다. 그래서 아마도 컴파일 오류의 원인이되는 코드를 오인하고 있습니다. 컴파일하지 않는 코드 (예 : ParameterComponent 클래스)를 붙여넣고 오류가 발생한 위치를 강조 표시 할 수 있습니까? –

답변

5

그래도 작동하지 않습니다. 문제는 getId() 호출이 상수의 값 표현식이 JLS에 따른 컴파일 타임 상수 표현식이 아니라는 것입니다. 자세한 내용은 JLS 15.28 Constant Expressions을 참조하십시오. 그러면 상수 표현식에서 메소드 호출이 허용되지 않습니다.

모든 스위치 명령문을 대규모로 변경해도 별다른 문제가 발생하지 않는다고 생각합니다. 그러나 나는 걱정하지 않을 것이다. IDE는 이전 상수의 모든 항목을 찾고 대체 할 수 있어야합니다.

후속

귀하의 코멘트에서 다음 코드 중 하나가 작동하지 않습니다

private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId(); 
public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER; 

첫째, INTEGER_VALUE_HOLDERJLS 4.12.4 Final Variables의 정의에 따라 "상수 변수는"아니다. 그러므로 어느 것도 INTEGER_VALUE이 아닙니다.

두 번째로 정적에 대한 이니셜 라이저 표현식은 this을 참조 할 수 없으며 INTEGER_VALUE_HOLDER은 실제로는 this.INTEGER_VALUE_HOLDER을 나타내는 또 다른 방법입니다.

+0

귀하의 올바른 - 주위에 심한 일들입니다 : 개인 int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId(); public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER; 그러나 그것은 리펙터의 목적을 무효화시킵니다. – emeraldjava

8

Java는 switch 문의 enum을 기본적으로 지원합니다. 귀하의 경우에 당신은 말을한다 :

DataType type = ...; 

switch (type) { 
    case UNKNOWN_VALUE 
     //do something 
     break; 
    case INTEGER_VALUE 
     //do something 
     break; 
    case LONG_VALUE 
     //do something 
     break; 
    case STRING_VALUE 
     //do something 
     break; 
    case BOOLEAN_VALUE 
     //do something 
     break; 
+0

Enum을 사용하여 switch 문을 사용하는 것이 맞는지 확인하십시오. 필자의 경우 DataType은 Object 유형을 나타내므로 Enum을 사용하도록 스위치를 리팩터링하는 대신 인터페이스를 만들고 case 문에서 논리를 개체로 이동하여 코드에서 switch 문을 제거 할 수 있도록 할 계획입니다. – emeraldjava

2

시도가 귀하의 경우 문에 GroupConstants. 접두사를 제거하기. 나에게 완전히 불분명 한 이유 때문에 클래스 이름 앞에 접두어가 붙은 경우 동일한 상수를 허용하지 않습니다.

그래서 대신

case GroupConstants.STRING_VALUE: 

시도하십시오

case STRING_VALUE: 

당신은 컴파일하기 위해 정적 가져 오기를해야 할 수도 있습니다.이클립스 IDE에서

+1

왜 downvote? –