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

Is it possible to use @AutoValue with Guice's FactoryModuleBuilder?

https://github.com/google/guice/wiki/AssistedInject,

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

..

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

..

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

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

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

Using AutoValue limits your public creation API to static factory methods, not constructors. See Effective Java Item 1 for several reasons this is usually a good idea anyway.

AutoValue does not and will not support creating mutable value types. (We may consider adding support for withField-style methods, which return a new immutable copy of the original instance with one field value changed.)

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

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