2012-11-13 31 views
2

我有枚舉:枚舉靜態數組和註釋值混亂

public enum Scope { 
    USER, GLOBAL; 

    public static final Scope[] TRANSIENT = {}; 
    public static final Scope[] USER_OVER_GLOBAL = {GLOBAL, USER}; 
    public static final Scope[] GLOBAL_OVER_USER = {USER, GLOBAL}; 
} 

和註釋:

public @interface Config { 
    public Scope[] load() default Scope.GLOBAL_OVER_USER; // Can't use this defval 

    public Scope[] save() default Scope.USER; 
} 

爲什麼我不能用靜態數組作爲默認值標註的財產?我的NetBeans 7.3 Beta告訴我需要Scope,但發現Scope[] - 正如你所看到的,這不是真的。是否存在NB或Java 7相關的混淆?

+0

你確定錯誤發生在所示的行上?因爲你的代碼在下面的代碼行中應該失敗 – Perception

+0

@Perception:這是註釋,所以'USER'被視爲'{USER}',它不是錯誤類型。爲註解的默認值創建的值 – kbec

回答

4

問題是Scope[] GLOBAL_OVER_USER不是全部不變。 (是的,數組本身是不變的,但是你可以如GLOBAL_OVER_USER[0] = GLOBAL;改變它的內容

一種解決方法是直接啓動陣列中的註釋聲明:

public Scope[] load() default {USER, GLOBAL}; 
+0

我知道這個解決方法,但是如何獲得這個註解屬性的默認值而沒有它的實例嗎? – kbec

+0

嗯,你沒有 至。通過添加'@ Config'(或@Config(save = Scope.GLOBAL)),註解的'load'值將保持默認值。 – matsev

+0

當然,但想象一下當你不註釋字段暗示註解默認值的情況。 – kbec