java - 绑定(bind)到 TypeLiteral 是 google guice 中的好习惯还是坏习惯

标签 java dependency-injection guice

Google guice 使用 new TypeLiteral<C<T>>() {}克服我们不能使用 C<T>.class 的事实.

现在常见的有:

bind(new TypeLiteral<C<T>>() {}).to(MyCSubclassTypedToT.class);

然而,想象一个不同的场景。我们有一个通用接口(interface),我们想要注入(inject)它,我们拥有的实现由一个通用类提供。

Guice 允许您这样做:

bind(new TypeLiteral<MyGenericInterface<T>>() {}).to(new TypeLiteral<MyGenericClass<T>>() {});

另一种方法是像这样扩展 MyGenericClass:

MyTypedClass extends MyGenericClass<T>

然后像这样绑定(bind)它:

bind(MyGenericInterface<T>>() {}).to(MyTypedClass.class);

如果 MyGenericInterface 被注入(inject)很多(尽管类型不同),并且每次注入(inject)它时我都使用 MyGenericClass,后一种方法会导致代码过于冗长。因此我倾向于使用前者。

我非常想听听其他人对在 guice 绑定(bind)的 to 子句中使用 TypeLiteral 的意见。恐怕我可能有点做空,因此看不到这种方法的缺陷。

最佳答案

在这种情况下,使用 TypeLiteral 作为通用实现让我觉得要好得多。

让我这样表述:“如果您不使用 Guice,子类 MyTypedClass 会存在吗?”。 Guice 的一个基本准则是:您不必更改您的实现类以适应 DI 框架(好吧,@Inject 注释之类的东西除外)。

您从具体但通用的类的子类化中得到什么?一大损失是您必须在所有子类中复制 MyGenericClass 的构造函数。总而言之,这似乎是没有太多收获的额外代码。

总而言之,使用TypeLiteral 通常没有任何问题。如果它在绑定(bind)子句的 .to(...) 部分(与 bind(...) 相对),它甚至不会影响公开- Module 绑定(bind)的可见部分,所以我认为没有什么可担心的。

关于java - 绑定(bind)到 TypeLiteral 是 google guice 中的好习惯还是坏习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10331610/

相关文章:

android - 尝试使用 Dagger2 了解 Android 上的依赖注入(inject)

AngularJS 两个不同的 $injector

android - 可以在android中使用guice吗?

java - 如何使用 google Guice 创建相同类型的多个实例

java - 按对象的属性对 map 进行排序

java - Spring Boot 不会调用我的 dao

Java数学题,结局不同!

java - 从 Hadoop 中的 Jar 中获取文件资源

Php,可以使用特征进行DI吗?

java - Guice 包装通用注入(inject)