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

주석과 해당 매개 변수가 컴파일 타임에 해결되므로 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 [] 상수를 사용하여 주석에 값을 제공하는 방법을 알고 있습니까?



답변

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

15.28. 상수 표현식

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

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

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


답변

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

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[]. 아마도 배열이 변경 가능하다는 사실이 마음에 들지 않습니까? 흠 …


답변

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

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() {
    }
}


답변

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

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


답변

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

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

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


답변

주석 필드에서 열거 형을 사용하고 해당 열거 형을 참조 할 수 있습니다


답변