상수 java에서 주석에 값을 제공하는 방법


146

주석과 해당 매개 변수가 컴파일 타임에 해결되므로 Java에서는 이것이 가능하지 않을 수 있다고 생각합니다. 다음과 같은 인터페이스가 있습니다.

public interface FieldValues {
   String[] FIELD1 = new String[]{"value1", "value2"};
}

또 다른 수업은

@SomeAnnotation(locations = {"value1", "value2"})
public class MyClass {
   ....
}

주석으로 많은 클래스를 표시하고 대신 모든 주석에 문자열을 지정하지 않아도되는지 알고 싶습니다.

@SomeAnnotation(locations = FieldValues.FIELD1)
public class MyClass {
   ....
}

그러나 이것은 주석 값과 같은 컴파일 오류를 배열 이니셜 라이저로 만들어야합니다. 누군가가 String 상수 또는 String [] 상수를 사용하여 주석에 값을 제공하는 방법을 알고 있습니까?

답변:


127

컴파일 상수 는 기본 요소 및 문자열 만 될 수 있습니다 .

15.28. 상수 표현식

컴파일 타임 상수 표현식 은 기본 유형의 값 또는 갑자기 완료되지 않고 다음을 사용하여 구성된 문자열을 나타내는 표현식입니다.

  • 기본 유형의 리터럴과 유형의 리터럴 String
  • 기본 유형으로 캐스트하고 유형으로 캐스트 String
  • [...] 연산자 [...]
  • 포함 된 표현식이 상수 표현식 인 괄호로 묶은 표현식입니다.
  • 상수 변수를 나타내는 간단한 이름.
  • TypeName 형식의 규정 된 이름 . 상수 변수를 나타내는 식별자 입니다.

실제로 Java에서는 배열의 항목을 보호 할 방법이 없습니다. 런타임에 누군가가 항상 할 수 FieldValues.FIELD1[0]="value3"있으므로 더 깊이 보면 배열이 실제로 일정하지 않을 수 있습니다.


14
열거 형도! :) :)
TacB0sS

1
@ TacB0sS, 열거 형은 상수 표현식이 아닙니다.
jaco0646

글쎄 ... 아마도 당신은 그것을 이동하고 알려주세요 ... 나는 항상 그들을 사용 :)
TacB0sS

4
보다 적절한 사양은 주석 아래에 있습니다. 상수 표현식 외에도 주석 값은 배열 이니셜 라이저 , 클래스 리터럴 또는 열거 형 상수 일 수 있습니다.
jaco0646

3
@ TacB0sS enum는 주석에서 사용할 수 있지만 컴파일 타임 상수는 아닙니다. 주석 static final EnumType VARIABLE = EnumType.ENUM_CONSTANT;을 작성 하고 사용하려고 할 때 차이점이 분명해집니다 VARIABLE. 작동하지 않습니다. 당신은 사용할 수있는 EnumType.ENUM_CONSTANT상수 표현 아니라, 특히 주석 (과에서 허용하는 switch문).
Holger

37

주석의 매개 변수로 상수 (정적, 최종 변수)를 사용할 수 있습니다. 빠른 예로, 나는 이것을 다음과 같이 상당히 자주 사용합니다.

import org.junit.Test;
import static org.junit.Assert.*;

public class MyTestClass
{
    private static final int TEST_TIMEOUT = 60000; // one minute per test

    @Test(timeout=TEST_TIMEOUT)
    public void testJDK()
    {
        assertTrue("Something is very wrong", Boolean.TRUE);
    }
}

TEST_TIMEOUT상수를 주석에 바로 전달할 수 있습니다 .

필자는 배열에서 이것을 시도한 것을 기억하지 못하므로 배열이 Java 변수와 비교하여 주석 매개 변수로 표현되는 방식에 약간의 차이가있는 문제가 발생할 수 있습니까? 그러나 질문의 ​​다른 부분은 문제없이 상수 문자열을 사용할 수 있습니다.

편집 : 방금 String 배열로 이것을 시도했지만 언급 한 문제에 부딪치지 않았습니다. 그러나 컴파일러 배열이로 정의되었지만 "속성 값은 일정해야합니다"라고 나에게 말했습니다 public static final String[]. 아마도 배열이 변경 가능하다는 사실이 마음에 들지 않습니까? 흠 ...


1
나를 위해 힘든 행운! 오 아야 나는 문자열 / 숫자를 전달할 수 있었지만 배열은 전달할 수 없었습니다. 나는 이것에 조금 더 많은 시간을 할애하고 아무것도 해결되지 않으면 대답을 받아 들일 것입니다 :)
Kannan Ekanath

예, FIELD1 배열의 변경 가능성이 문제입니다. 그 밖의 어떤 것도 해당 배열에 액세스 할 수 없으므로 나중에 변경할 수 없으므로 배열 이니셜 라이저로 배열을 선언 할 수 있습니다.
ColinD

이것은 내 문제를 해결합니다. 주석과 코드간에 문자열 상수를 공유해야했습니다. 감사!
simon

1
정적 최종 변수가 유일한 전제 조건은 아닙니다. 변수를 동적으로 계산하려고하면 동일한 오류 메시지가 표시됩니다.
Wolfgang Fahl 2016 년

11

예제에서 배열을 제공하지 않습니다. 다음은 잘 컴파일됩니다.

public @interface SampleAnnotation {
    String[] sampleValues();
}

public class Values {
    public static final String val0 = "A";
    public static final String val1 = "B";

    @SampleAnnotation(sampleValues={ val0, val1 })
    public void foo() {
    }
}

4
예제에서는 어노테이션 선언에서 직접 작성된 배열이 아니라 배열과 함께 제공됩니다.
ColinD

7

누군가 String 상수 또는 String [] 상수를 사용하여 주석에 값을 제공하는 방법을 알고 있습니까?

불행히도 배열로는이 작업을 수행 할 수 없습니다. 비 배열 변수의 경우 값은 최종 정적이어야합니다.


5

주석과 해당 매개 변수가 컴파일 타임에 해결되므로 Java에서는 이것이 가능하지 않을 수 있다고 생각합니다.

Seam 2 http://seamframework.org/ 를 사용하면 런타임시 주석 언어를 큰 따옴표로 묶어 주석 매개 변수를 분석 할 수있었습니다.

Seam 3 http://seamframework.org/Seam3/Solder 에서이 기능은 Seam Solder 모듈입니다


3
아니요, 런타임에 매개 변수 를 확인하지 않았습니다 . 이 매개 변수는 컴파일 타임에 해결되었습니다. 그런 다음 런타임에 무언가를 수행하는 데 사용되었다는 것은 문자 적으로 값을 설정할 때 아무런 관련이 없습니다.
기금 모니카의 소송

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.