如何将@AutoFactory 与@AutoValue class 一起使用?

How can I use @AutoFactory with an @AutoValue class?

假设我有一个简单的 AutoValue class:

@AutoValue abstract class Foo {
  abstract CommonDependency commonDep();
  abstract String uniqueDataPerInstance();

  static Foo create(CommonDependency commonDep, String data) {
    return new AutoValue_Foo(commonDep, data);
  }
}

现在我想要一个工厂,这样我就不需要在每次想要 Foo 时都通过 commonDep。如果这不是 AutoValue class,我可以通过注释 CommonDependency @Provided.

简单地使用 AutoFactory

您知道让这两个代码生成器协同工作的方法吗?

这确实是一个很有趣的问题,因为@AutoFactory注解只能应用于非抽象classes。

error: Auto-factory doesn't support being applied to abstract classes.

对于带注释的构造函数,编译器失败后甚至没有有用的错误消息。

由于在代码生成过程中只有 abstractfinal 自动值 class,我们必须注释最后一个和最后一个 class .为此,您必须实现一个自动值扩展,它 mustBeFinal() 并使用 @AutoFactory 注释注释 class 声明或最终 class 的构造函数。

这里还有一个问题生效了,因为构造函数的参数需要适当的注解。因此需要在此处添加 @Provided@Nullable 或任何 @Qualifier 注释。这里最大的问题是,@Provided 定义了 @Target(PARAMETER) 并且使用自动值我们只定义方法。

如果不想自己实现,可以尝试使用auto-value-factory。我在这个过程中实现了它,以查看两个自动库如何协同工作。