Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.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 如果未找到@Named,则使用dagger的默认实现_Java_Android_Dagger 2 - Fatal编程技术网

Java 如果未找到@Named,则使用dagger的默认实现

Java 如果未找到@Named,则使用dagger的默认实现,java,android,dagger-2,Java,Android,Dagger 2,我面临的问题是我有一个基类和多个子类。为了解析特定的子类,我在Dagger 2中使用@Named注释。我试图实现的是,如果我注入@Named(“Child3”),而@Named(“Child3”)没有提供,那么默认情况下我应该获得基类的实例 public class BaseClass { public void haveFun(){ System.out.print("Having fun base"); } } public class Child1 e

我面临的问题是我有一个基类和多个子类。为了解析特定的子类,我在Dagger 2中使用@Named注释。我试图实现的是,如果我注入@Named(“Child3”),而@Named(“Child3”)没有提供,那么默认情况下我应该获得基类的实例

public class BaseClass {

    public void haveFun(){
        System.out.print("Having fun base");
    }

}

public class Child1 extends BaseClass {
    @Override
    public void haveFun() {
        System.out.print("Having fun Child1");
    }
}

public class Child2 extends BaseClass {
    @Override
    public void haveFun() {
        System.out.print("Having fun Child2");
    }
}
现在在模块中,我将提供如下对象:

@Provides
@Named("Child1")
static BaseClass provideChild1(){
    return new Child1();
}

@Provides
@Named("Child2")
static BaseClass provideChild2(){
    return new Child2();
}

@Provides
static BaseClass provideBaseClass(){
    return new BaseClass();
}
public class ReceiptActivity extends AppCompatActivity {

    @Inject @Named("Child1") BaseClass child1;
    @Inject @Named("Child2") BaseClass child2;
    @Inject @Named("Child3") BaseClass child3;

    // ...

}
现在在我的活动中,我是这样注射的:

@Provides
@Named("Child1")
static BaseClass provideChild1(){
    return new Child1();
}

@Provides
@Named("Child2")
static BaseClass provideChild2(){
    return new Child2();
}

@Provides
static BaseClass provideBaseClass(){
    return new BaseClass();
}
public class ReceiptActivity extends AppCompatActivity {

    @Inject @Named("Child1") BaseClass child1;
    @Inject @Named("Child2") BaseClass child2;
    @Inject @Named("Child3") BaseClass child3;

    // ...

}
由于未提供
@Named(“Child3”)
,因此存在编译时错误,但我想要的是,如果
@Named(“Child3”)
不存在,我应该获得一个
基类
实例


我怎样才能做到这一点

不幸的是,限定绑定(使用限定符注释的绑定,如
@Named
)实际上没有回退或默认值。每个绑定都是不同的,不同的绑定不被认为是相关的。这使得编写您所要求的后备逻辑变得困难

这也是有道理的:
@Named(“Porsche”)引擎
@Named(“割草机”)引擎
尽管共享一个基本类型,但它们永远不会真正相互替代。它们是完全不同的依赖项,如果您缺少名为(“Porsche”)的
@引擎
,Dagger遵循的策略是,它应该在编译时失败,而不是到处寻找不匹配或不合格的引擎

相比之下,您可以绑定地图或使用来指示您正在寻找的可替代性或灵活性。与其注入绑定本身,不如注入一个映射,或者注入一个封装映射并为您提取正确绑定的工厂

// This uses Multibindings, but you could manually create a Map instead.

@Binds @IntoMap @StringKey("Child1")
abstract BaseClass provideChild1(Child1 child1);

@Binds @IntoMap @StringKey("Child2")
abstract BaseClass provideChild2(Child2 child2);

// Then in your consumer...

@Inject Map<String, BaseClass> mapOfBaseClasses;
@Inject BaseClass baseClass;

// Or make an injectable Factory:

public class YourClassFactory {
  private final Map<String, Provider<BaseClass>> baseClassMap;
  private final Provider<BaseClass> baseClassProvider;

  @Inject public YourClassFactory(/* ... */) { /* set fields */ }

  public BaseClass get(String key) { /* write fallback logic here */ }
}

@命名限定符不起作用,因为您是例外。当您在活动中提到@named(“Child3标记”)时,它会在提供者中搜索相同的“Child3标记”,并初始化对象。换句话说,我们可以说它的工作是匹配与child3-tag匹配的提供者的特定方法。是的,如果没有找到匹配项,那么我如何返回基类实例?您不能直接这样做。我会建议你调整你的逻辑部分,这样你就不会陷入这个问题。或者,您可以在提供的方法中写入决策层(如果条件),并根据条件返回Child1或child2或基本对象。