2015-01-12 2 views
1

Используя Guice, я хотел бы создать три разных экземпляра для моего класса Color, то есть BLUE, RED, YELLOW и хочу связать разные значения цвета ... но я не понимаю, как связать различное значение для экземпляра ...Guice - Ввод различного значения в строковую переменную на экземпляр

Для приведенного ниже кода кода, если вы видите, я хотел бы использовать ту же реализацию ColorClass для всех трех цветов. Экземпляры (называемые «BLUE», «RED», «ORANGE») передавая другой цвет как переменную String.

public interface ColorInterface { 
    public String getMeColor() 
} 

Пример реализации ....

public class ColorClass implements ColorInterface { 
    @Inject @Named("color") 
    String color 

    public String getMeColor(){ 
     return color 
    } 

} 

Пример связывания ........

public class ColorModule extends AbstractModule { 

    @Override 
    protected void configure() { 

      bind(ColorInterface.class).annotatedWith(Names.named("BLUE")).to(ColorClass.class); 
      bind(ColorInterface.class).annotatedWith(Names.named("RED")).to(ColorClass.class); 
      bind(ColorInterface.class).annotatedWith(Names.named("ORANGE")).to(ColorClass.class); 

      ...... 
    } 

} 

Пожалуйста, помогите мне ...

+0

Пожалуйста, подумайте о принятии решения, если оно решит вашу проблему. Благодаря! – Jayant

ответ

3

Если это напрямую это ваша проблема, я бы предложил небольшое изменение в реализации, чтобы переместить введенный @Named("color") String в аргумент конструктора и нас е обычая Provider:

public class ColorClass implements ColorInterface { 
    String color; 

    ColorClass(String color) { 
     this.color = color; 
    } 

    public String getMeColor(){ 
     return color; 
    } 

    public static Provider implements Provider<ColorClass> { 
     String color; 
     public Provider(String color) { 
      this.color = color; 
     } 
     public ColorClass get() { 
      return new ColorClass(color); 
     } 
    } 
} 

, а затем в модуле:

public class ColorModule extends AbstractModule { 

    @Override 
    protected void configure() { 

      bind(ColorInterface.class).annotatedWith(Names.named("BLUE")) 
       .toProvider(new ColorClass.Provider("Blue")); 
      bind(ColorInterface.class).annotatedWith(Names.named("RED")) 
       .toProvider(new ColorClass.Provider("Red")); 
      bind(ColorInterface.class).annotatedWith(Names.named("ORANGE")) 
       .toProvider(new ColorClass.Provider("Orange")); 
    } 

} 

Очевидно, что Provider не нужно быть статическим внутренний класс, как я там делал, только что-то в то же самое пакет.

В случае, если эта точная проблема на самом деле не является вашей проблемой, и вам действительно нужно @Named("color") String, чтобы ее по-разному вводили (скажем, у вас действительно есть действительно глубокая вложенная структура, сложенная вместе с узором и нуждающаяся в другом связывании в глубине иерархии и не может легко реорганизовать это в параметр конструктора), тогда вам нужно будет использовать private modules.

Однако этот способ огромный переполненный для случая, который вы представили, поэтому я не решаюсь погрузиться в него здесь. Это действительно довольно продвинутая тема, которую вы не должны пытаться решать, если вам действительно не нужно решать проблему, которую она решает. (Проблема иногда упоминается как проблема «Robot Arms»)

+0

Спасибо, Дэниэл. Это правильное решение моей проблемы – rock

+0

@rock, если вам нравится решение, можете ли вы принять ответ? – NamshubWriter