标准对象工厂可能如下所示:
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

解决方法

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

MapBinder式

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.class);
    mybinder.addBinding(3).to(C.class);
    mybinder.addBinding(4).to(D.class);
  }
}

配置有这些模块的注射器将提供可注射的Map< Integer,I>.有一切事物的实例;这里它将是一个从3到完全注入的A实例的三条目映射,从3到C实例,从4到D实例.这实际上是对您的switch示例的改进,它使用了new关键字,因此没有将任何依赖项注入A或B.

对于不会创建如此多浪费实例的更好选项,请注入Map< Integer,Provider< I>> MapBinder也自动提供.像这样使用它:

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();
  }
}

更简单,工厂风格

如果上面看起来有点矫枉过正,请记住你可以inject an Injector并创建一个从键到实现的本地Map. (你也可以像我在这里一样使用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();
  }
}

java – Can Guice可以根据参数自动创建不同类的实例吗?的更多相关文章

  1. PHP基于IMAP收取邮件的方法示例

    这篇文章主要介绍了PHP基于IMAP收取邮件的方法,结合实例形式分析了PHP基于IMAP接收邮件的相关设置与使用技巧,并附带了IMAP相关函数说明,需要的朋友可以参考下

  2. 谷歌Gmail邮箱开启SMTP/IMAP服务流程

    本篇专门定向讲解谷歌Gmail邮箱,如何开通SMTP协议的流程,在讲篇幅前,我需要你确定3件事: 1.你已经有谷歌账号了 2.你很清楚自己为什么想要开通SMTP服务 3.你已经掌握一定的基础知识,能够

  3. 在CentOS 7上没有包php-imap

    我正在使用CentOS764位运行专用服务器,这是尝试安装IMAP时的输出:禁用排除时也是如此:只需运行以下命令即可yuminstallepel-release*yum安装PHP-imap*

  4. 如何在CentOS中安装多个imap服务器(只有一个工作)

    我的CentOS服务器上当前安装了courier-imap.我想在不卸载courier-imap的情况下安装另一个imap服务器,然后能够在它们之间切换,也就是说,我可以尝试两个并决定哪个投注适合我的需要,而不是总是卸载一个他们并安装另一个.那可能吗?可以并行安装多个IMAP服务器.您可以通过init脚本启动它来选择您要运行的IMAP服务器.例如,要停止您的快递地图问题:注意,我没有运行courier-imap所以请仔细检查init脚本名称.要安装dovecot:启动dovecot:要在重新引导期间保持更

  5. ubuntu – 我在哪里可以找到postfix,saslauthd和courier的调优资源

    我刚刚将postfix,saslauthd,courier部署到运行Ubuntu8.04并具有512MB内存的初始VPS盒中.大多数内存现在被这些进程吃掉了.我计划升级到具有更多RAM的计划,并最终切换专用硬件.但与此同时,任何人都可以向我指出一些资源来帮助我调整配置.快递中没有很多可调参数–您可以调整底层机器,而不是软件本身.话虽这么说,但您可以采取一些措施来提高性能:>更多内存.我知道你打算这

  6. php – 使用imap访问电子邮件

    我在Ubuntu14.02上使用Apache,并运行PHP.我已经连接到一个远程的mssql服务器,因此不需要mysql.我想知道如何连接到gmail注册的电子邮件id,以便读取传入的电子邮件.我已经尝试了下面,但它显示一个空白的屏幕,当我的本地主机运行它:我在运行程序时插入我的实际gmail用户名和密码.我想知道我是否缺少一些东西.非常感谢这是解决方案:>登录到您的Gmail帐户,启用imap.

  7. ubuntu – imap over https安全吗?

    我有一个运行Nginx/PHP和邮件服务器的Ubuntu12.04服务器.为了访问邮件,我通过https使用squirrelmail.我无法配置imaps所以我正在使用简单的imap.我的问题:是否通过https客户端访问了imap与安全性相当的imaps?假设您在同一台服务器上运行邮件IMAP服务器和squirrelmail,在Squirrelmail中读取邮件与在电子邮件客户端中通过IMAPS阅读邮件一样安全.请记住,HTTPS和IMAP之间没有任何关系,并且您的电子邮件客户端的连接未加密.

  8. CentOS6安装dovecot并提供sasl功能

    dovecot是一个流行的POP/IMAP服务器。在不采用ssl/tls加密的情况下,POP服务器默认端口是110/TCP,IMAP服务器默认端口是143/TCP。下面介绍如何在CentOS6上安装dovecot并提供sasl功能。把下面的”-IINPUT5”部分,改成你自己环境的。

  9. 在PHP中使用IMAP获取唯一的电子邮件ID

    如何为IMAP帐户中的每封电子邮件计算唯一ID字符串?我正在编写一个脚本,必须经常将所有丢失的邮件从一个IMAP帐户复制到另一个帐户.我想避免在每次更新时都重复,因此我必须确定一个帐户上的内容以及另一个帐户上的内容.并非所有电子邮件都有message_id,我看不出message_id和uid之间的区别是什么–有人可以告诉我吗?在我看来,当使用imap_append时,message_id没有改变–任何人都可以确认吗?

  10. PHP库读取电子邮件

    我目前使用SwiftMailer库发送电子邮件,但不幸的是它仅用于发送,而不是接收.我想知道…

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部