2011-12-01 77 views
1

我想使用關鍵字符串上的註釋來配置該關鍵字屬性的初始值。例如,如何在Java註釋參數中接受多種類型?

@NodeProperty(initialValue = "bar") static final String "FOO"; 

其他代碼後處理註釋,增加一鍵「FOO」與價值「酒吧」到特定的key-value存儲,如果key「FOO」已經不存在。

我的註釋聲明:

@Retention(RetentionPolicy.RUNTIME) 
@interface NodeProperty { 
    long initialValue(); // I want to accept Strings, ints, byte[], etc. here. 
} 

但是,我不知道initialValue時間提前的類型。我想接受所有的基元,字符串和這些數組。

有關如何完成此任何想法?

編輯:

不幸的是,這聽起來像超載註釋參數目前還不可能。下面的答案包含各種解決方法。

+1

接受一個'Object'? – talnicolas

+0

編譯器不允許這樣做,因爲註釋參數類型必須是原始類,類,字符串,枚舉或這些的數組。即使是基元的對象版本也是不允許的。 –

+0

這不是一個類型問題,而是一個「編譯時常量」問題,我想。 –

回答

2

接受單一類型(可能爲String),並使用類型轉換將它從你所得到的領域中獲得。與Commons BeanUtils或XWork允許註冊類型轉換器從字符串表單值到任意Java類相似。

+0

謝謝。我認爲這是最好的解決方法。它需要在註釋中指定兩個參數(類型和字符串表示形式)---遠比實際值更煩人---但它起作用! –

+0

@DavidB。它不應該,你有這個領域的類型 - 使用它。 –

+0

@Dave。正如目前所寫,沒有一個領域的財產,所以你的建議是不可能的。唯一的字段是關鍵字符串。值的類型是(或理想情況下)從初始值推斷出來的。屬性存儲在第三部分對象中,因此每個對象都沒有字段。另外,它們不能在這個類之外訪問,所以註釋可以被放置的getter或setter不可用或不可取。 –

1

對於不同的類型你可能有不同的屬性,然後檢查你的代碼中哪一個屬性有值。因此,而不是initialValue,你可能有initialInt,initialString,initial(...)。麻煩,但我能想到的唯一方法是始終使用一個字符串值,然後解析它的具體類型。

另一種選擇可能是顛倒你的聲明。在註釋中使用關鍵字,並將值作爲變量進行註釋?

+0

顛倒聲明是一個聰明的想法。不幸的是,我需要可訪問的密鑰作爲靜態最終字段,但否則會起作用。 –

+1

另一個想法,雖然我並不是說它是一個很好的(或者甚至是好的)想法,但是將屬性屬性作爲包含默認值以及通過反射訪問的類中另一個字段的名稱。 –

+0

這肯定會使註解處理代碼變得更清潔,但會以犧牲額外的靜態字段爲代價。要求將默認值作爲靜態字段訪問實際上不會太糟糕(至少我現在正在設想的事情)。這些都是Java的註釋類型系統的限制,但至少這個有一些可測量的積極副作用(如果你眯得夠緊),而不僅僅是負面的副作用。 –

相關問題