2012-09-27 73 views
9

我正在編寫使用Jackson進行JSON序列化的Java代碼。在我的一個類之前我必須使用的一個註釋是@JsonTypeName(/*Insert string here*/),以便爲此類的對象提供用於序列化的唯一標識符。在我當前的代碼中,我們通過使用另一個類的全局常量來設置String參數。例如:Java無法將enum用作註釋的String參數(例如:Jackson)

public class AnnotationValues { 
    private static final String id1 = "1"; 
    private static final String id2 = "2"; 
    private static final String id3 = "3"; 
    // And so on... 
} 

使用這個類,我們的註解大概類似於@JsonTypeName(AnnotationValues.id1)。我個人不認爲這是一種非常健壯的編碼風格,使用一類全局的String常量。一旦我的應用程序需要處理大量的JSON消息並因此需要許多不同的標識符,這將變得煩人。我自然會通過使用enum來解決這個問題。我會替換類:

public enum AnnotationValues { 
    ID1("1"), 
    STATS_RESPONSE("2"), 
    SESSION_RESPONSE("3"), 
    /* Add more... */; 
    public final String value; 
    private AnnotationValues(String value) { 
     this.value = value; 
    } 
} 

使用這個枚舉,我想寫@JsonTypeName(AnnotationsValues.ID1.value)作爲我的註釋。但這不起作用。我收到此錯誤消息:「註釋屬性JsonTypeName.value的值必須是常量表達式」。一個簡單的谷歌/ SOF搜索導致我this SOF post告訴我爲什麼這是一個錯誤;註釋參數的字符串值必須是常量。很煩人,我不能使用enum

是否有其他人遇到這個問題?什麼是這種類型的問題接受的解決方案?我真的應該爲我的註釋使用一串很長的字符串常量嗎?有什麼方法可以使用我的Enum打撈?還要別的嗎?

+0

對不起,但這是不是重複您引用該帖子的副本? http://stackoverflow.com/questions/3271659/use-enum-type-as-value-parameter-for-rolesallowed-annotation – Gray

回答

6

我真的希望我或其他人能給你一個不同的答案,但不,沒有其他的方法可以更好地工作。在這種情況下,我們都使用一個充滿靜態最終字符串的類。你試圖讓它工作的方式應該可行,但事實並非如此。目前,這只是它在Java中的方式。我自己曾經遇到過這個問題,而且我也很煩惱,發現枚舉不能像常量表達式那樣對待。我感覺到你的痛苦,再次,我希望我能給你一個不同的答案。

-1

正如其他答案所示,不,這對於Java註釋來說是不可能的。

但我想問一下:爲什麼你認爲使用Enum會比使用String常量更好?對我來說,這些方法看起來很相似,純粹是簡單的,添加Enum包裝器會有什麼意義? 兩種情況下的引用類似,實際常量存儲在集中式位置,這有其好處,因此您可以共享相同的字符串。

所以我不太明白「不要認爲這是一個非常強大的編碼風格」,評論,或者至少不是如何使用額外的無所事事Enum包裝會改善設計。

+0

當你說什麼必須是一個特定的枚舉,那麼你限制了給定方法的可能輸入或在這種情況下的註釋。如果你必須使用String常量,那麼字符串可能來自任何地方,並且代碼完成不會給你Enum的明顯選擇,因爲它可以強制將它鍵入Enum類型。 – Novaterata

+0

@novaterata常量將全部在特定的容器類中,所以自動完成將工作得很好。雖然IDE(或編譯器)無法阻止你從其他地方傳遞任意字符串,但它確實看起來像是試圖解決一個並不存在的問題。 – StaxMan