0

根据https://github.com/google/guice/wiki/AssistedInject

假设我有一个接口A,实现类AImpl和另一个接口AFactory,我与 FactoryModuleBuilder 一起使用 -

..

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

..

是否可以将AutoValue用于AImpl?我的担心是AImpl抽象的,工厂模块将无法实例化它。如果我AutoValue_AImpl改为传递给工厂模块,它将没有@Assisted*注释。

4

1 回答 1

1

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

AutoValue 通常创建具有健壮性和实现的数据对象值对象。从 AutoValue 创建的对象是不可变的,具有静态工厂方法而不是构造函数;Guice 提供的依赖没有空间或理由。请参阅文档equalshashCode

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

AutoValue 不支持也不会支持创建可变值类型。(我们可能会考虑添加对 withField 样式方法的支持,该方法返回原始实例的一个新的不可变副本,其中一个字段值已更改。)

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

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

于 2016-03-22T17:52:42.007 回答