2016-03-18 27 views
0

https://github.com/google/guice/wiki/AssistedInjectGuice的FactoryModuleBuilder可以使用@AutoValue吗?

可以说我有一个接口A,实现类AImpl和另一个接口AFactory,我与FactoryModuleBuilder使用 -

.. 

install(new FactoryModuleBuilder() 
    .implement(A.class, AImpl.class) 
    .build(AFactory.class) 
); 

.. 

是否有可能使用AutoValueAImpl?我的担心是AImpl将是抽象的,工厂模块将不能实例化它。如果我通过AutoValue_AImpl而不是工厂模块,它将不会有@Assisted*注释。

+0

为什么不尝试呢? –

+0

我试过了。 @AssistedInject不能放在构造函数以外的方法上。所以我不能在'AImpl'中使用它。而且我无法访问'AutoValue_AImpl'中的构造函数,因为这是生成的代码 – 0cd

回答

1

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

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

使用AutoValue将您的公共创建API限制为静态工厂方法,而不是构造函数。无论如何,参见Effective Java Item 1有几个原因,这通常是一个好主意。

AutoValue不会也不会支持创建可变值类型。 (我们可以考虑增加对withField式的方法,改变返回原实例的新一成不变的副本有一个字段值的支持。)

FactoryModuleBuilder一般为有一定的依赖注入和一些manually-对象创建工厂指定的依赖关系。如上所述,AutoValue包不应该符合这个描述。

当然,你可以使用Guice中的常量来构建你的值对象;但是,您需要通过编写自己的轻量级工厂对象来完成此操作,该对象根据需要将可注射参数映射到值对象的方法。

相关问题