当前位置: 首页 > 知识库问答 >
问题:

Guice可以根据参数自动创建不同类的实例吗?

钦高峯
2023-03-14

标准对象工厂可能如下所示:

interface I { ... }
class A implements I { ... }
class B implements I { ... }

class IFactory {
    I getI(int i) {
        switch (i) {
        case 1: return new A();
        default: return new B();
        }
    }
}

是否可以设置绑定以便为我完成切换,即我所做的只是调用 getInstance 或注入?我正在研究辅助注射,但这似乎是不同的主题:https://code.google.com/p/google-guice/wiki/AssistedInject

共有1个答案

公良天逸
2023-03-14

听起来您正在寻找一个< code>MapBinder,它是多绑定功能的一部分。请注意,您仍然需要放入某种类型的< code>IFactory或其他工厂接口,因为< code>getInstance不像< code>getI那样接受参数,并且您仍然需要在某处建立从整数到类实现的映射。

class IModule extends AbstractModule {
  @Override public void configure() {
    MapBinder<Integer, I> myBinder =
        MapBinder.newMapBinder(binder(), Integer.class, I.class);
    myBinder.addBinding(1).to(A.class);
    // Add more here.
  }
}

// You can even split the MapBinding across Modules, if you'd like.
class SomeOtherModule extends AbstractModule {
  @Override public void configure() {
    // MapBinder.newMapBinder does not complain about duplicate bindings
    // as long as the keys are different.
    MapBinder<Integer, I> myBinder =
        MapBinder.newMapBinder(binder(), Integer.class, I.class);
    myBinder.addBinding(3).to(C.class);
    myBinder.addBinding(4).to(D.class);
  }
}

配置了这些模块的喷油器将提供可注射的地图

对于不会创建太多浪费实例的更好选择,请注入 Map

class YourConsumer {
  @Inject Map<Integer, Provider<I>> iMap;

  public void yourMethod(int iIndex) {
    // get an I implementor
    I i = iMap.get(iIndex).get();
    // ...
  }
}

但是,要以您的方式提供“默认”实现(和不透明接口),您需要在 MapBinder 映射之上实现自己的短包装器:

class IFactory {
  @Inject Map<Integer, Provider<I>> iMap;
  @Inject Provider<B> defaultI; // Bound automatically for every Guice key

  I getI(int i) {
    return iMap.containsKey(i) ? iMap.get(i).get() : defaultI.get();
  }
}

如果以上内容看起来有些多余,请记住,您可以注入一个< code >注入器并创建一个从键到实现的本地< code >映射。(您也可以像我在这里一样使用< code>ImmutableMap。

class IFactory {
  @Inject Injector injector; // This is a bad idea, except for times like this
  @Inject Provider<B> defaultI;
  static final ImmutableMap<Integer, Class<? extends I>> map = ImmutableMap.of(
      1, A.class,
      3, C.class,
      4, D.class);

  I getI(int i) {
    return map.containsKey(i)
        ? injector.getInstance(map.get(i))
        : defaultI.get();
  }
}
 类似资料:
  • 问题内容: 标准对象工厂可能如下所示: 是否可以设置绑定以便为我完成切换,即我要做的就是调用getInstance或inject?我当时在看辅助注射,但这似乎是另外一个话题:https : //code.google.com/p/google- guice/wiki/AssistedInject 问题答案: 听起来您正在寻找,这是多重绑定功能的一部分。请注意,您仍然需要放入某种工厂接口或其他工厂接

  • 本文向大家介绍C#实现根据实体类自动创建数据库表,包括了C#实现根据实体类自动创建数据库表的使用技巧和注意事项,需要的朋友参考一下 .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标注的声明性信息 如下代码(Id、Name为User的属性,[DbKey]为Id的特性) 特性分预定

  • 对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢

  • 有什么方法可以为我创建的类使用自动装箱吗?例如,我有的子类。 现在,< code > UnsignedInteger I = new UnsignedInteger(88);工作得非常好,但是有什么方法可以让这个编译:< code > UnsignedInteger i = 88?对我来说不会。提前感谢!

  • 我们已经使用Google Guice框架进行依赖注入。我需要在Java创建一个接口的多个insatnce。 执行从这里开始:下面代码中的KFHRecordValidator.java类: process类具有RecordValidationHelper类的引用,并且注入是通过构造函数进行的。iRecordValidationService.java是一个具有validate方法的接口。 类处理器有

  • 问题内容: 有时,我创建一个装饰器类,如下所示: IntelliJ可以自动为我创建此类吗? 问题答案: 更新// 我注意到IntelliJ具有用于生成委托方法的“生成”选项。创建一个新类: 然后标记myInterface,转到“菜单”>“代码”>“委托方法”,选择要包装的所有方法,仅此而已。 //更新结束 您可以尝试“重构”->“用委派替换继承”重构。这样就应该能够做到。我称之为“使用Alt +