Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 2注入pojo依赖项?_Java_Android_Dagger 2 - Fatal编程技术网

Java 如何使用dagger 2注入pojo依赖项?

Java 如何使用dagger 2注入pojo依赖项?,java,android,dagger-2,Java,Android,Dagger 2,我有一个简单的pojo类: public class MySimpleClass { private List<String> mDependency; public MySimpleClass (List<String> dependency) { mDependency = dependency; } } 公共类MySimpleClass{ 私有列表依赖性; 公共MySimpleClass(列表依赖项){ mdepende

我有一个简单的pojo类:

public class MySimpleClass {

    private List<String> mDependency;

    public MySimpleClass (List<String> dependency) {
        mDependency = dependency;
    }
}
公共类MySimpleClass{
私有列表依赖性;
公共MySimpleClass(列表依赖项){
mdependence=依赖性;
}
}
我正在尝试使用dagger 2的依赖注入创建它。现在我有一个简单的模块和组件:

@Module
public class MySimpleClassModule {

    @Provides
    MySimpleClass provideMySimpleClass(List<String> dependency) {
        return new MySimpleClass(dependency);
    }
}

@Component(modules={MySimpleClassModule.class})
public interface MySimpleClassComponent {
}
@模块
公共类MySimpleClassModule{
@提供
MySimpleClass提供MySimpleClass(列表依赖项){
返回新的MySimpleClass(依赖项);
}
}
@组件(模块={MySimpleClassModule.class})
公共接口MySimpleClassComponent{
}

但我不确定每次需要创建
MySimpleClass
的新实例时如何注入
列表
依赖项。在上面的场景中,似乎我实际上需要将
List
添加到
MySimpleClassModule
的构造函数中,并且每当我需要一个带有新
List
mysimpleclasss
的新实例时,都需要该模块的一个新实例。对吗?在这种特殊情况下,似乎会有很多开销。

如果要定义对象的构造函数,最好使用
@Inject
构造函数。Dagger 2将自动知道如何实例化该对象,这样您就不需要在模块中提供带注释的方法

public class MySimpleClass {

    private List<String> mDependency;

    @Inject
    public MySimpleClass (List<String> dependency) {
        mDependency = dependency;
    }
}
公共类MySimpleClass{
私有列表依赖性;
@注入
公共MySimpleClass(列表依赖项){
mdependence=依赖性;
}
}
Dagger将假定构造函数的参数是依赖项,并尝试从依赖关系图中解析它们。请注意,每个类只能有一个带注释的构造函数!如果您自己无法实例化对象(例如Android活动/片段),则需要使用字段注入

在您的情况下,似乎没有必要将空列表注入
MyClass
。您可以在构造函数中实例化列表。但是,当您想将
MyClass
注入另一个对象时,它将已经在对象图中。

不,它不是

我假设您在Dagger中出现编译错误,因为从问题中不清楚您是否已经有一个模块提供了这个字符串列表

要解决此问题,您只需:

@Module
public class MySimpleClassModule {

    @Provides
    List<String> provideListDependency() {
        return Arrays.asList("One", "Two");
    }

    @Provides
    MySimpleClass provideMySimpleClass(List<String> dependency) {
        return new MySimpleClass(dependency);
    }
}
@模块
公共类MySimpleClassModule{
@提供
列表provideListDependency(){
返回数组。asList(“一”、“二”);
}
@提供
MySimpleClass提供MySimpleClass(列表依赖项){
返回新的MySimpleClass(依赖项);
}
}
如果您认为提供此列表应该是另一个模块的一部分,您可以移动它。最重要的是,在编译过程中,Dagger能够找到如何获得这种依赖性


如果你不想在上面创建这个数组,你可以将这个方法标记为
@Singlethon
,这样dagger就会缓存它。

谢谢,但我认为这并不能真正解决问题。在您的方法中,我现在必须声明一种方法来“提供”我的
列表
依赖项,比如在模块中。因此,每当我需要一个新的
MySimpleClass
实例时,我仍然需要实例化一个新模块。现在,如果我按照您的建议更改它,我会得到“错误:java.util.Collection不能在没有@Provides注释方法的情况下提供。”就像我说的,您实际上不需要插入列表。只需在对象内部实例化它
public类MySimpleClass{private List mDependency;@Inject public MySimpleClass(){mDependency=new ArrayList();}}}
class A {
    String name;
    @Inject
    A(String name) {
        this.name = name;
    }


    @Component
    interface AComponent {
        A getA();
        @Component.Builder
        interface Builder {
            @BindInstance
            Builder provideName(String name);
            A build();
        }
    }