2010-01-14 25 views
106

我認爲這可能不適用於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 { 
    .... 
} 

但是這給了像註釋值編譯錯誤,應該是一個數組初始化程序等是否有人知道如何可以使用字符串常量或字符串[]不斷爲註釋提供價值?

回答

92

編譯常數can only be primitives and Strings

15.28。常量表達式

編譯時常量表達式是表示原始類型或字符串的一個值,該值不會突然完成,並使用由表達式只有以下:

原始類型的
  • 字面和類型String
  • 的文字施放到原始類型並投射到鍵入String
  • [...]運營商[...]
  • 包含表達式的括號表達式是一個常量表達式。
  • 引用常量變量的簡單名稱。
  • 表格的合格名稱TypeName標識符引用常量變量。

其實在java中沒有辦法保護數組中的項目。在運行時,有人總是可以做FieldValues.FIELD1[0]="value3",因此如果我們看得更深,陣列不能真正保持恆定。

+9

也枚舉! :) :) – TacB0sS 2012-04-16 00:00:17

+2

我認爲參考網址死了。常量上的Java規範是指你所指的是什麼?即,http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 – 2013-01-16 06:35:35

+0

@ TacB0sS,枚舉不是常量表達式。 – jaco0646 2015-10-12 20:47:55

5

是否有人知道我可以用一個 字符串常量或字符串[]恆 提供價值的註釋?

不幸的是,你不能用數組來做到這一點。對於非數組變量,該值必須是最終靜態的。

32

可以使用常量(即靜態最終變量)作爲註釋的參數。作爲一個簡單的例子,我用這樣的事情相當頻繁:

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[]。也許它不喜歡數組是可變的事實?嗯...

+0

真倒黴我!哦,我能夠傳遞字符串/數字,但不是數組。我會花更多時間在這個上,如果什麼都不解決,我會接受答案:) – 2010-01-14 17:17:46

+0

是的,我的猜測是FIELD1陣列的可變性是這裏的問題。您可以使用數組初始值設定項來聲明數組,因爲沒有其他人可以訪問該數組,因此以後不能再進行更改。 – ColinD 2010-01-14 18:20:03

+0

這解決了我的問題。只需要在註釋和代碼之間共享一個字符串常量。謝謝! – simon 2013-12-20 14:35:24

9

你沒有在你的例子中提供一個數組。以下罰款編譯:

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

它在示例中提供了一個數組,而不是直接在註釋聲明中創建的數組。 – ColinD 2010-01-14 19:23:16

相關問題