32

我正在尝试让Dagger开始我的项目。

但是,在编译过程中,我的一个类出现以下异常:

错误:Foo 上没有可注入成员。你想添加一个可注入的构造函数吗?

但是,该类没有依赖项,因此使用默认的无参数构造函数:

public class Foo
{
    ...
}

我真的需要像下面这样添加一个可注入的无参数构造函数吗?

public class Foo
{
     @Inject
     public Foo()
     {
     }

     ....
}
4

1 回答 1

41

文档

Dagger 无法构造缺少 @Inject 注解的类。

Dagger 主动要求您通过添加无参数构造函数或添加可注入字段来将 @Inject 添加到可注入类中。第三种选择是从 @Provides 方法返回类,如下所示:

@Module(...)
class MyModule {
  @Provides Foo provideFoo() {
    return new Foo(); // Foo is not injectable.
  }
}

这似乎是额外的样板,但根据 Guice 和其他框架的经验,随机类的 JIT 绑定结果是错误的。我们已经看到 java.lang.String 被注入到事物中,并且因为有人忘记绑定它,你最终注入了 "" 而不是所需的字符串。因此,Dagger 需要一个 @Inject 构造函数或字段。(Guice 在 4.x 中可选地有这个,但为了向后兼容,默认情况下它是关闭的)

这是 Dagger 以少量冗长为代价选择更多正确性保证的罕见例子。

于 2013-08-20T20:43:24.690 回答