2014-04-22 2 views
3

Я работаю с весной 4, и у меня есть перечисление объявлено как ...Можно ли связать компоненты Spring с помощью аннотаций с помощью перечислений?

public static enum MY_ENUMS { 
    A(1, "enum1"), 
    B(2, "enum2"); 

    private final int key; 
    private final String name; 

    MY_ENUMS(int key, String name) { 
     this.key = key; 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public int getIndex() { 
     return this.key; 
    } 
} 

Тогда из моего компонента я пытается сделать что-то вроде ...

// @Named is the equivalent of @Component for this use case 
// Making name public and trying this also does not work: 
// @Named(MY_ENUMS.A.name) 
@Named(MY_ENUMS.A.getName()) 
public class ServiceImplA implements IService { 

    @Override 
    public Object interfaceMethod() { 
     // Some code specific to ServiceImplA here.... 
    } 
} 

Это не строится, и я знаю ПОЧЕМУ это не строится. В принципе, MY_ENUMS.A.getName() не представляется компилятору постоянным, что означает, что он не может использоваться здесь. Но точка перечислений состоит в том, что они позволяют вам метод объявления констант полезным способом. Итак, с учетом сказанного, есть способ, которым я могу указать имя моего компонента, обратившись к значению в перечислении?

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

ответ

6

Есть ли способ указать имя моего компонента, указав значение в перечислении?

Нет, не существует. Если атрибут аннотации ожидал enum, вы могли бы просто использовать enum. Но вызов метода не разрешает постоянное выражение. Можно подумать, что вы могли бы сделать поле public и доступ к нему непосредственно

@Named(MY_ENUMS.A.name) 

но это не будет работать, потому что MY_ENUMS.A.name не является постоянным выражением либо.

Фактическая причина, по которой это не является постоянным выражением, состоит в том, что константа перечисления является в основном переменной. Существует такая вещь, как постоянная переменная, которая является постоянным выражением. Для переменной, которая должна быть постоянной переменной, она должна быть final и инициализирована постоянным выражением. Константа enum равна final, но не инициализируется постоянным выражением. Основном enum константа компилируется в

public static final YourEnum constant = new YourEnum(); 

Выражение new YourEnum() не является постоянным выражением. И поэтому константа не является постоянной переменной и не может использоваться для разрешения переменной String, которая может быть постоянной переменной.

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