Есть ли способ получить доступ к значениям по умолчанию в аннотации статически? - PullRequest
1 голос
/ 14 апреля 2020

Предположим, у вас есть какая-то аннотация Annot:

@Retention(/*your retention policy*/)
@Target(/*targeted element type*/)
public @interface Annot {
    String value() default "Hello World!";
}

А в некотором связанном коде, скажем, процессоре аннотаций, вам нужно значение по умолчанию value() Поле аннотации без имеет доступ к классу, помеченному @Annot. Конечно, вы можете просто сделать

public static final String ANNOT_VALUE_DEFAULT = "Hello World!";

в своем классе процессора, а затем изменить в @Annot:

String value() default Processor.ANNOT_VALUE_DEFAULT;

(Processor - имя класса вашего процессора аннотаций ). Хотя это нормально работает с String s, изменение @Annot завершается неудачно, если типом value() является enum. Он может не работать и для других значений, но enum является частью моего варианта использования, поэтому, если это не сработает, не имеет значения, будут ли работать другие типы.

Теперь, конечно, Самый простой способ решить эту проблему - просто указать значение по умолчанию, указанное в @Annot и Processor, отдельно. Но каждый программист знает, что дублированные константы вообще не очень хорошая идея. Возможно, вы захотите автоматически отражать изменения в одной части (например, @Annot) в других частях (например, Processor). Чтобы это работало, вы должны быть в состоянии сделать это:

var defaultVal = Annot.value(); // statically (without an instance annotated with @Annot) access default value

Итак, возможен ли этот доступ c каким-либо образом?

Частичное решение

Мне не нужно сейчас искать решение, так как я уже нашел полу-удобный обходной путь (см. Мой ответ). Тем не менее, поскольку обходной путь немного «хакерский», я хочу знать, есть ли более элегантный способ сделать это.

1 Ответ

0 голосов
/ 14 апреля 2020

Обходной путь

Если окажется, что не существует удовлетворительного решения для этого, но вам, читателю, действительно нужно решение, взгляните на этот обходной путь:

Итак, проблема в том, что вы хотите получить доступ к значению по умолчанию без указания с классом, помеченным @Annot. Ну, кто сказал, что у вас нет доступа к такому классу? Просто добавьте этот (предпочтительно пакетный) класс в ваш исходный код:

@Annot
class DefaultAnnotValues {
    private static final Annot ANNOT = DefaultAnnotValue.class.getAnnotation(Annot.class);

    static SomeEnum value = ANNOT.value();

    // add all other enum fields with default values here

    private DefaultAnnotValues() {
    }
}

Теперь вы можете получить доступ ко всем значениям по умолчанию для вашей аннотации, и когда вы измените значение по умолчанию в определении аннотации, оно будет автоматически отражается везде, где вы используете эти значения по умолчанию.

...