是否可以将@AutoValue与Guice的FactoryModuleBuilder一起使用?

时间:2016-03-18 01:53:55

标签: guice auto-value

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*注释。

1 个答案:

答案 0 :(得分:1)

这些包不能很好地协同工作;更重要的是,没有理由你应该一起使用这两个功能。

AutoValue通常会创建数据对象值对象,并具有强大的equalshashCode实现。从AutoValue创建的对象是不可变的,使用静态工厂方法而不是构造函数; Guice提供的依赖项没有空间或理由。见the docs

  

使用AutoValue将公共创建API限制为静态工厂方法,而不是构造函数。请参阅有效的Java项目1,原因有几个,这通常是一个好主意。

     

AutoValue不支持也不支持创建可变值类型。 (我们可以考虑添加对withField样式方法的支持,这些方法返回原始实例的新不可变副本,并更改​​了一个字段值。)

FactoryModuleBuilder通常为具有一些注入依赖项和一些手动指定依赖项的对象创建工厂。如上所述,AutoValue包永远不适合此描述。

当然,您可以使用Guice可访问的常量来构建您的值对象;但是,您需要编写自己的轻量级工厂对象,根据需要将可注入参数映射到值对象的方法。