Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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 如何使用Dagger2实现工厂_Java_Android_Dependency Injection_Dagger 2 - Fatal编程技术网

Java 如何使用Dagger2实现工厂

Java 如何使用Dagger2实现工厂,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我想用Dagger2建立一个工厂,但我不知道怎么做 在一个简化示例中: public class Foo{ public interface Factory{ Foo createNew(); } private Bar bar; public Foo(Bar bar){ this.bar= bar; } } 我想设置一个提供Foo.Factory实例的方法 @Module public class TestModu

我想用Dagger2建立一个工厂,但我不知道怎么做

在一个简化示例中:

public class Foo{

    public interface Factory{
        Foo createNew();
    }

    private Bar bar;

    public Foo(Bar bar){
        this.bar= bar;
    }
}
我想设置一个提供Foo.Factory实例的方法

@Module
public class TestModule{
    @Provides
    Bar provideBar(){
        return new Bar();
    }

    @Provides
    Foo.Factory provideFooFactory(){
        // ??????
    }
}
结果应该是(当然是从模块中获取Bar实例):


实现这一目标的正确方法是什么?

我有一个可行的解决方案。如果你有更好的办法,请告诉我

@Module
public class TestModule{
    @Provides
    Bar provideBar(){
        return new Bar();
    }
    @Provides
    Foo provideFoo(Bar bar){
        return new Foo(bar);
    }

    @Provides
    Foo.Factory provideFooFactory(final Provider<Foo> fooProvider){
        return  new Foo.Factory(){
                    @Override
                    public Foo createNew() {
                        return fooProvider.get();
                    }
        };
    }
}
@模块
公共类测试模块{
@提供
Bar provideBar(){
返回新条();
}
@提供
Foo provideFoo(酒吧){
返回新的Foo(bar);
}
@提供
工厂供应商工厂供应商(最终供应商){
返回新的Foo.Factory(){
@凌驾
public Foo createNew(){
返回fooProvider.get();
}
};
}
}

如果您可以在JSR330中使用Dagger熟悉的提供程序,为什么要定义工厂接口?文档中说,除了遗留应用程序之外,不要使用提供程序,您应该使用工厂模式,但没有提供任何关于如何使用Dagger实际执行此操作的示例。
@Module
public class TestModule{
    @Provides
    Bar provideBar(){
        return new Bar();
    }
    @Provides
    Foo provideFoo(Bar bar){
        return new Foo(bar);
    }

    @Provides
    Foo.Factory provideFooFactory(final Provider<Foo> fooProvider){
        return  new Foo.Factory(){
                    @Override
                    public Foo createNew() {
                        return fooProvider.get();
                    }
        };
    }
}