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

4

嗨,我有一个非常简单的关于Android的Dagger问题。

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

class Fooz {
    private Foo1 mFoo1;

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

这两个类有什么相同之处? 第一个直接注入Foo1字段,而第二个在构造函数中分配mFoo1。 对于第二个,当创建并添加Fooz到对象图中时,是否会立即从对象图中注入Foo1? 如果它们不同,为什么呢? 谢谢!

可能是 https://dev59.com/YVoV5IYBdhLWcg3wkvh1?rq=1 的重复问题。 - Ricardo Costeira
2个回答

4
构造函数注入可以更好地控制对象的实例化,因为使用字段注入意味着将类的创建限制在反射上,并依赖于对这些特定注入注释的支持。此外,将依赖项清晰地放在构造函数中使得代码更易于维护和测试。
据我所知,在Dagger图中它的持有方式没有任何区别,但构造函数调用总是比注入字段快。
在我看来,我们应该仅在无法控制对象创建时(例如在ActivitiesFragments中)使用属性。

1
这些类在使用依赖注入时会表现相同。然而,当使用你定义的构造函数时,它们的行为会有所不同。
例如1:调用new Fooz()将导致mFoo1为空。
例如2:调用new Fooz(foo1)将导致mFoo1被初始化为foo1。
首选(个人意见)的方法是在构造函数上使用依赖注入注释,因为它可以避免空指针异常,就像在比较示例1和示例2时所解释的那样。此外,这样的构造函数在测试类时提供了更多的灵活性,因为你可以更轻松地提供模拟对象。
这里有一个具有更好描述的SonarQube规则,解释了我提到的内容: https://sonarcloud.io/coding_rules?open=squid%3AS3306&rule_key=squid%3AS3306

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接