Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger中字段和构造函数注入的区别_Java_Android_Dagger - Fatal编程技术网

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

Java Dagger中字段和构造函数注入的区别,java,android,dagger,Java,Android,Dagger,嗨,我有一个非常简单的关于android的匕首问题 class Fooz { @Inject Foo1 mFoo1; public Fooz() { .... } } class Fooz { private Foo1 mFoo1; @Inject public Fooz(Foo1 foo1) { mFoo1 = foo1; } } 这两个类如何相同? 第一个直接注入Foo1字段,而第二个在构造函数中分配mFo

嗨,我有一个非常简单的关于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。调用新的Fooz(foo1)将导致mFoo1被初始化为foo1

首选的(个人意见)方法是在构造函数上使用依赖项注入注释,因为这将避免空指针异常,如比较示例1和示例2时所述。更重要的是,这种构造函数在测试类时提供了更大的灵活性,因为您可以更轻松地提供模拟


这是一条描述更好的sonarqube规则,解释了我提到的内容。

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

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

在我看来,我们应该仅在无法控制对象创建时使用属性,例如在
活动
片段
,每个示例。

可能重复的