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

Difference between field and constructor injections in Dagger

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

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

class Fooz {
    private Foo1 mFoo1;

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

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

这些 类 将在使用依赖注入注入 Fooz 时表现相同。但是,当使用您定义的构造函数构造它们时,它们的行为会有所不同。

示例 1. 调用 new Fooz() 将导致 mFoo1 为 null。

示例2. 调用new Fooz(foo1) 将导致mFoo1 被初始化为foo1。

首选(个人意见)方式是在构造函数上使用依赖注入注解,因为它会避免空指针异常,正如在比较示例 1 和示例 2 时所解释的那样。更重要的是,这样的构造函数在测试您的代码时提供了更大的灵活性类 因为你可以提供模拟,所以更容易。

这些是 sonarqube 规则,描述得更好,解释了我提到的内容 https://sonarcloud.io/coding_rules?open=squid%3AS3306&rule_key=squid%3AS3306

构造函数注入使您可以更好地控制对象实例化,因为使用字段注入意味着将您的 class 创建限制为反射并依赖对这些特定注入注释的支持。除此之外,清楚地了解构造函数的依赖关系让代码更易于维护和测试。

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

在我看来,只有当我们无法控制对象创建时才应该使用 属性,例如 ActivitiesFragments