Как указать экземпляр Enum по умолчанию для Guice? - PullRequest
3 голосов
/ 02 марта 2011

Мне нужно что-то вроде

@DefaultInstance(Level.NORMAL)
enum Level {NORMAL, FANCY, DEBUGGING}

, что заставит Guice вернуть Level.NORMAL для выражения

injector.getInstance(Level.class)

Нет такой вещи, как @DefaultInstance. В качестве обходного пути я попробовал @ProvidedBy с тривиальным Provider, но он не работает.

Ответы [ 3 ]

5 голосов
/ 03 марта 2011

Возможно, переопределяющие модули могут вам помочь. Уровень по умолчанию можно настроить с помощью модуля AppLevel:

public class AppModule extends AbstractModule {
    @Override
    public void configure() {
        bind(Level.class).toInstance(Level.NORMAL);
        // other bindings
    }
}

и конкретный можно настроить в небольшом переопределяющем модуле:

public class FancyLevelModule extends AbstractModule {
    @Override
    public void configure() {
        bind(Level.class).toInstance(Level.FANCY);
    }
}

В конце просто создайте инжектор, перекрывающий AppModule с определенной Level конфигурацией:

public static void main(String[] args) {
    Injector injector = 
        Guice.createInjector(
            Modules.override(new AppModule()).with(new FancyLevelModule())
    );

    System.out.println("level = " + injector.getInstance(Level.class));
}

UPDATE

Эта проблема может быть решена немного по-другому. Допустим, что Level используется в классе как внедренное поле:

class Some
{
  @Injected(optional = true)
  private Level level = Level.NORMAL;
}

Уровень по умолчанию будет инициализирован как часть создания экземпляров Some. Если какой-либо модуль конфигурации Guice объявляет какой-то другой уровень, он может быть добавлен по желанию.

4 голосов
/ 30 ноября 2012

Решение, но, к сожалению, без использования аннотаций, будет:

enum Level 
{
    NORMAL, FANCY, DEBUGGING;

    static final Level defaultLevel = FANCY; //put your default here
}

затем определите модуль следующим образом:

public class DefaultLevelModule extends AbstractModule 
{
    @Override public void configure() 
    {
        bind(Level.class).toInstance(Level.defaultLevel);
    }
}
0 голосов
/ 05 марта 2011

Это проблема 295 и выглядит как очень тривиальная ошибка.

Я исправил ее для себя и, возможно, однажды кто-нибудь там исправит эту очень старую проблему.1005 *

...