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

时间:2017-02-02 17:51:39

标签: java auto-value autofactory

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

@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类,我可以通过注释CommonDependency @Provided来轻松使用AutoFactory。

你知道如何让这两个代码生成器很好地协同工作吗?

1 个答案:

答案 0 :(得分:1)

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

  

错误:自动出厂不支持应用于抽象类。

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

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

这是另一个生效的问题,因为需要对构造函数参数进行适当的注释。因此,需要在其中添加@Provided@Nullable或任何@Qualifier注释。这里最大的问题是,@Provided定义@Target(PARAMETER),而自动值我们只定义方法。

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