3 回答

TA貢獻1829條經驗 獲得超4個贊
編譯常量只能是基元和字符串:
15.28。常數表達式
編譯時常量表達式是表示基本類型的值的表達式或不突然完成的字符串,僅使用以下內容組成:
原始類型的文字和類型的文字?
String
轉換為基本類型和轉換為類型?
String
[...]運營商[...]
括號表達式,其包含的表達式是常量表達式。
引用常量變量的簡單名稱。
TypeName表單的限定名稱。引用常量變量的標識符。
實際上在java中沒有辦法保護數組中的項目。在運行時,有人總能這樣做FieldValues.FIELD1[0]="value3"
,因此如果我們看得更深,那么數組就不能真正保持不變。

TA貢獻1809條經驗 獲得超8個贊
您可以使用常量(即靜態的最終變量)作為注釋的參數。作為一個簡單的例子,我經常使用這樣的東西:
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而沒有任何問題。
編輯:我剛剛嘗試使用String數組,并沒有遇到你提到的問題 - 但編譯器確實告訴我“屬性值必須是常量”,盡管數組被定義為public static final String[]
。也許它不喜歡數組是可變的這個事實?嗯...

TA貢獻1993條經驗 獲得超6個贊
在示例中,您沒有為它提供數組。以下編譯正常:
public @interface SampleAnnotation { String[] sampleValues(); } public class Values { public static final String v1 = "A"; public static final String v2 = "B"; @SampleAnnotation(sampleValues = { v1, v2 }) public void foo() { } }
添加回答
舉報