Guice:注入一个字符串的ArrayList

Jac*_*cks 3 java arraylist inject guice

我试图注入一个ArrayListString与吉斯的帮助秒.我想显示一个带有许多RadioButtons的面板(例如),用户可以选择一些要激活的服务.

选择后,我想获取所选服务的所有名称并将其添加到列表中,并将此列表注入负责创建服务的经理.这是一个例子:

public class UIProviderModule extends ProviderServiceModule {
    private ArrayList<String> requestedServices;

    public UIProviderModule(ArrayList<String> requestedServices) {
        this.requestedServices = requestedServices;
    }

    @Override
    protected void configure() {
        bindConstant().annotatedWith(Names.named(Constants.REQ_SERVICES)).to(requestedServices);
        bind(IParser.class).to(UIParser.class);
        super.configure();
    }

}
Run Code Online (Sandbox Code Playgroud)

我见过很多关于Multibindings和提供者的帖子,但我不明白这对我有什么帮助.我只是想检索名称,因为我不使用必须绑定到接口的类.我错过了什么吗?

注意:我知道这可能不是使用Guice好方法,因为我将列表绑定到Module.

Jef*_*ica 6

这很容易做Guice:

bind(new TypeLiteral<List<String>>() {})
    .annotatedWith(Names.named(Constants.REQ_SERVICES))
    .toInstance(requestedServices);
Run Code Online (Sandbox Code Playgroud)

请注意,为了绑定一个List<String>不用Java擦除泛型,你可以创建一个短命的匿名内部类型(TypeLiteral的子类,带有空体{}).你也用toInstance.

使模块采用用于绑定的参数没有任何问题,而且当在一个地方容易收集所有绑定时,我更喜欢使用Multibindings.

请注意,ArrayList<String>您接受的是可变的,因此如果您在多个地方注入此消息,则一个消费者可以永久更改其他人的列表.使用Guava ImmutableList.copyOf(list)或者更有意义Collections.unmodifiableList(list)(尽管如果模块创建者稍后更改传入列表,后者仍会让列表更改).


关于您提出的应用程序生命周期,请记住Guice的绑定在创建注入器后应保持或多或少的恒定.您描述的生命周期可能有两个方面:

  • 在没有Guice帮助的情况下显示您的对话框,然后使用所选选项创建一个Injector
  • 注入List<String>所有选项,显示对话框,然后传递列表
  • 注入List<String>所有选项,显示对话框,然后创建包含所选选项列表的子注入器

但是,所有这些都是可行的,具体取决于您希望完整列表和选定列表在您的应用程序中的可访问性.