Dagger默认构造函数

foe*_*ens 27 dagger

我想让Dagger在我的项目上工作.

但是,在编译期间,我在其中一个类上遇到以下异常:

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

但是,该类没有依赖关系,因此使用默认的no-arg构造函数:

public class Foo
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

     ....
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ber 33

来自文档:

缺少@Inject注释的类不能由Dagger构造.

Dagger主动要求您通过添加no-args构造函数或添加可注入字段将@Inject添加到您的注入类中.第三个选项是从@Provides方法返回类,如下所示:

@Module(...)
class MyModule {
  @Provides Foo provideFoo() {
    return new Foo(); // Foo is not injectable.
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这是一个罕见的例子,Dagger以少量冗长的代价选择了更多的正确性保证.