Dagger中字段和构造函数注入之间的区别

时间:2018-11-20 16:49:28

标签: java android dagger

嗨,我对Android有一个非常简单的匕首问题。

class Fooz {
    @Inject Foo1 mFoo1;
    public Fooz() {
        ....
    }
}

class Fooz {
    private Foo1 mFoo1;

    @Inject public Fooz(Foo1 foo1) {
        mFoo1 = foo1;
    }
}

两个类如何相同? 第一个直接注入Foo1字段,而第二个在构造函数中分配mFoo1。 对于第二个对象,Fooz一创建并添加到对象图后,就从对象图注入Foo1吗? 如果不同,为什么呢? 谢谢!

2 个答案:

答案 0 :(得分:0)

当使用依赖注入来注入Fooz时,这些类的行为相同。但是,当使用您定义的Constructor进行构造时,它们的行为会有所不同。

示例1.调用新的Fooz()将导致mFoo1为空。

示例2。调用新的Fooz(foo1)将导致mFoo1初始化为foo1。

首选的方法(个人观点)是在构造函数上使用依赖项注入批注,因为它将避免空指针异常,如在示例1和示例2进行比较时所解释的。此外,当构造类测试为您可以轻松地提供模拟。

这是具有更好描述的声纳法则,解释了我提到的https://sonarcloud.io/coding_rules?open=squid%3AS3306&rule_key=squid%3AS3306

答案 1 :(得分:0)

构造函数注入使您可以更好地控制对象实例化,因为使用字段注入意味着将类创建限制为反射,并依赖对这些特定注入注释的支持。除此之外,在构造函数上具有明确的依赖性使代码更易于维护和测试。

据我所知,它在匕首图上的保存方式没有什么区别,但构造函数调用总是比注入字段快。

我认为,例如,ActivitiesFragments中,我们在无法控制对象创建的情况下应该使用属性。