2012-11-13 2 views
2

У меня есть перечисление:Enum статические массивы и значение аннотаций путаница

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

@Перцепция: это аннотация, поэтому '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

Смежные вопросы