每https://github.com/google/guice/wiki/AssistedInject,
假设我有一个接口A
,实现了类AImpl
和另一个与FactoryModuleBuilder一起使用的接口AFactory
-
..
install(new FactoryModuleBuilder()
.implement(A.class, AImpl.class)
.build(AFactory.class)
);
..
是否可以将AutoValue用于AImpl
?我关心的是AImpl
是抽象的,工厂模块无法实例化它。如果我将AutoValue_AImpl
传递给工厂模块,它就不会有@Assisted*
注释。
答案 0 :(得分:1)
这些包不能很好地协同工作;更重要的是,没有理由你应该一起使用这两个功能。
AutoValue通常会创建数据对象或值对象,并具有强大的equals
和hashCode
实现。从AutoValue创建的对象是不可变的,使用静态工厂方法而不是构造函数; Guice提供的依赖项没有空间或理由。见the docs:
使用AutoValue将公共创建API限制为静态工厂方法,而不是构造函数。请参阅有效的Java项目1,原因有几个,这通常是一个好主意。
AutoValue不支持也不支持创建可变值类型。 (我们可以考虑添加对withField样式方法的支持,这些方法返回原始实例的新不可变副本,并更改了一个字段值。)
FactoryModuleBuilder通常为具有一些注入依赖项和一些手动指定依赖项的对象创建工厂。如上所述,AutoValue包永远不适合此描述。
当然,您可以使用Guice可访问的常量来构建您的值对象;但是,您需要编写自己的轻量级工厂对象,根据需要将可注入参数映射到值对象的方法。