Binding Guice-为每个实例的字符串变量注入不同的值

Binding Guice-为每个实例的字符串变量注入不同的值,binding,guice,multiple-instances,code-injection,Binding,Guice,Multiple Instances,Code Injection,使用Guice,我想为我的颜色类创建三个不同的实例,即蓝色、红色、黄色,并希望绑定不同的颜色值。。。但我不明白如何绑定每个实例的不同值 对于下面的示例代码,如果您看到的话,我希望通过将不同的颜色作为字符串变量传递,对所有三种颜色实例(命名为“蓝色”、“红色”、“橙色”)使用相同的ColorClass实现 public interface ColorInterface { public String getMeColor() } 示例实现 public class ColorClass

使用Guice,我想为我的颜色类创建三个不同的实例,即蓝色、红色、黄色,并希望绑定不同的颜色值。。。但我不明白如何绑定每个实例的不同值

对于下面的示例代码,如果您看到的话,我希望通过将不同的颜色作为字符串变量传递,对所有三种颜色实例(命名为“蓝色”、“红色”、“橙色”)使用相同的ColorClass实现

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);

            ......
    }

}

请帮助我…

如果这直接是您的问题,我建议在实现中稍作更改,将注入的
@Named(“color”)字符串
移动到构造函数参数中,并使用自定义
提供程序

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);
        }
    }
}
显然,
Provider
不需要像我在那里做的那样是一个静态的内部类,只是在同一个包中

如果这个确切的问题不是你真正的问题,你真的需要以不同的方式注入
@Named(“color”)String
(比如说,你实际上已经有了一些非常深层的嵌套结构,需要在层次结构的深层进行不同的绑定,并且不能轻松地将其重构为构造函数参数),那你就需要使用


然而,对于您介绍的案例来说,这种技巧是远远超出了要求的,所以我不太愿意在这里深入讨论。这确实是一个相当高级的话题,除非你真的需要解决它解决的问题,否则你不应该尝试去解决。(这个问题有时被称为“机器人手臂”问题)

谢谢丹尼尔。这是解决我的问题的正确方法problem@rock如果你喜欢这个解决方案,你能接受这个答案吗?如果它解决了你的问题,请考虑接受解决方案。谢谢
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"));
    }

}