gpt4 book ai didi

java - 使用 google-guice 注入(inject)列表的最佳方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:59 25 4
gpt4 key购买 nike

我有三个类(class) CircleBuilder , SquareBuilder , 和 TriangleBuilder实现ShapeBuilder界面。

我需要初始化我的 FormBuilder尤其是 BuilderList (扩展 List<ShapeBuilder> )每个类的一个实例与 google-guice。

什么是最好的方法?

我知道提供者方法和类似这样的东西:

@Provides
FormBuilder provideFormBuilder() {
DatabaseTransactionLog instance = new FormBuilder ( <numerous parameters> );

ShapeBuilder builder = null ;
builder = new CircleBuilder( <numerous parameters> ) ;
instance.addBuilder( builder ) ;

builder = new SquareBuilder( <numerous parameters> ) ;
instance.addBuilder( builder ) ;

// And so on

return instance;
}

但这意味着我必须创建我的 FormBuilder手动这违背了使用 guice 的目的(因为 FormBuilder 是我的对象图中的顶部元素)。

我很想能够写出这样的东西:

bind(BuilderList.class).to(CircleBuilder.class);
bind(BuilderList.class).to(TriangleBuilder.class);
bind(BuilderList.class).to(SquareBuilder.class);

有什么想法吗?

最佳答案

考虑 Multibindings ,它将非常像您的代码片段一样收集绑定(bind)。没有通过 Multibinder 提供列表,因为 Multibinder 旨在绑定(bind)到多个模块中的同一集合,并且 Multibinder 列表的元素顺序将取决于您的模块的评估顺序。

Multibinder<ShapeBuilder> shapeBinder =
Multibinder.newSetBinder(binder(), ShapeBuilder.class);
shapeBinder.addBinding().to(CircleBuilder.class);
shapeBinder.addBinding().to(TriangleBuilder.class);
shapeBinder.addBinding().to(SquareBuilder.class);

// Now you can inject Set<ShapeBuilder>.

或者,your @Provides method可以接受参数(例如 CircleBuilderProvider<CircleBuilder> ),因此您可以让 Guice 创建除 List 本身之外的所有内容。 Guice 不仅会自动绑定(bind)所有绑定(bind)类型的 Provider,还会在任何 @Provides 中注入(inject)每个参数。方法。

@Provides List<ShapeBuilder> provideShapeBuilders(
CircleBuilder circleBuilder,
SquareBuilder squareBuilder,
TriangleBuilder triangleBuilder,
Provider<TrapezoidBuilder> trapezoidBuilderProvider) {
return new ArrayList<ShapeBuilder>(
circleBuilder,
squareBuilder,
triangleBuilder,
trapezoidBuilderProvider.get(),
trapezoidBuilderProvider.get());
}

关于java - 使用 google-guice 注入(inject)列表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14203696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com