использовать значение из вызова метода в Enum в качестве параметра аннотации

у меня есть

enum Operations { 
 OPERATION_NAME("operation/path");    
    private final String path;

    Operations(String path) {
        this.path = path;
    }

    public String path() {
        return path;
    }
}

Я хотел бы использовать значение пути для аннотаций в моих методах REST API.

  @Path(Operations.OPERATION_NAME.path())
  void operation() {
  }

но компилятор java жалуется

Значение атрибута должно быть постоянным

Есть ли способ решить это в java8?

Я знаю, что у меня может быть одно перечисление с именами операций и набор статических строковых полей с путями (статические строки могут использоваться как атрибут в аннотации @Path), но мне не нравится такой подход.


person Bartosz Bilicki    schedule 08.08.2017    source источник
comment
Значение атрибута аннотации должно оцениваться во время компиляции, а экземпляр enum может оцениваться только во время выполнения.   -  person Usagi Miyamoto    schedule 08.08.2017
comment
@UsagiMiyamoto не enum, а метод. Enum можно использовать как параметр аннотации   -  person ByeBye    schedule 08.08.2017
comment
Экземпляры не могут быть оценены во время компиляции, так как ссылка на них создается при загрузке класса...   -  person Usagi Miyamoto    schedule 08.08.2017
comment
Куча статических строковых полей с путями — это путь.   -  person Sergey Kalinichenko    schedule 08.08.2017
comment
Кстати, чего вы пытаетесь достичь этим?   -  person Usagi Miyamoto    schedule 08.08.2017
comment
Я хочу использовать перечисление с именами методов в одном месте и путь в другом месте (клиентские вызовы в тестах, аннотации @Path).   -  person Bartosz Bilicki    schedule 08.08.2017


Ответы (1)


Вы не можете использовать методы перечисления в параметре аннотации, но вы можете создать класс:

public final class Operations {

    private Operations() {};

    public static final String op1 = "operation/path";
    public static final String op2 = "operation2/path";

    public enum Enum { 

        OPERATION1(op1),
        OPERATION2(op2);

        private final String path;

        Enum(final String path) {
            this.path = path;
        }

        public final String path() {
            return path;
        }
    }

}

Дублирования не будет, и вы по-прежнему сможете использовать свой enum так же, как и раньше, и литералы static String в аннотациях.

person ByeBye    schedule 08.08.2017
comment
ОП написал, что им не нравится подход поля static в enum... Как вы думаете, почему им понравится это в отдельном class, который скрывает enum внутри себя? - person Usagi Miyamoto; 08.08.2017
comment
Не идеально, но кажется, что это не лучший вариант. Я не могу получить имя операции как вызов метода для перечисления. У меня должна быть статическая строка. Так что теперь, по крайней мере, я вижу, что все эти статические строки используются (в операционных перечислениях) - person Bartosz Bilicki; 08.08.2017
comment
@UsagiMiyamoto Я просто предлагаю способ связать перечисление с полями static string. Нет лучшего способа - person ByeBye; 08.08.2017