【问题标题】:Google Guava Supplier ExampleGoogle Guava 供应商示例
【发布时间】:2010-10-25 12:38:07
【问题描述】:

请用合适的例子说明Supplier(in Guava)接口的使用。

【问题讨论】:

    标签: java guava


    【解决方案1】:

    Supplier 接口只是一个返回值的无参数函数的抽象......它是一种获取对象的一些实例或实例的方法。由于它是如此通用,它可以用于许多东西。 Jared 解释了 Multimaps 工厂如何将其用作工厂来创建某种类型的 Collection 的新实例以获取值。

    鉴于界面的简单性,它还允许通过将Supplier 包装在另一个Supplier 中以某种方式改变其行为来对Supplier 的行为进行一些非常强大的修饰。记忆就是其中的一个例子。我自己使用了Suppliers.memoizeWithExpiration 方法作为一种简单的方法来实现它,因此在给定的时间段内,某些数据最多只能从服务器读取一次。

    我还建议您查看 Guice 以及如何在其中使用 Provider 接口。 Provider 完全等同于 Supplier,并且是 Guice 工作方式的核心。

    • Provider 允许用户定义创建给定类的新对象的自定义方式。用户可以编写一个get() 方法,该方法可以执行创建新对象所需的任何代码,因此他们不限于让Guice 单独使用构造函数来创建对象。在这里,他们使用它为对象的新实例定义自定义 工厂
    • Guice 允许注入任何依赖项的Provider。这可能会在每次调用get() 时返回一个新实例,或者它可能总是返回一个实例或介于两者之间的任何实例,具体取决于Provider 表示的绑定的范围。这也允许对依赖项进行“延迟实例化”...Provider 为类提供了一种创建对象的方法,而无需提前实际创建对象。在调用 get() 之前,不需要创建对象的实例。
    • 如上所述,Providers 构成了 Guice 范围界定的基础。如果您查看Scope 接口,您会注意到它的单个方法Provider<T> scope(Key<T> key, Provider<T> unscoped) 是根据Providers 定义的。此方法采用创建对象新实例的东西Provider<T> unscoped)并根据应用范围定义的任何策略返回Provider<T>,可能会返回对象的一些缓存实例而不是创造一个新的。默认的NO_SCOPE 范围只是传递unscoped 提供程序,这意味着每次都会创建一个新实例。 SINGLETON 作用域缓存第一次调用unscoped.get() 的结果,然后返回该单个实例,确保依赖于单个作用域对象的所有内容都获得对该单个对象的引用。请注意,SINGLETON 作用域的scope 方法返回的ProviderSuppliers.memoize 返回的Supplier 的作用基本相同(虽然它有点复杂)。李>

    【讨论】:

      【解决方案2】:

      我们在 Guava 中包含 Supplier 的主要原因是支持生成任意 Multimap 的 Multimaps 方法,例如

      public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map,
          Supplier<? extends Collection<V>> factory)
      

      供应商创建一个包含给定键的所有值的集合。每当您使用尚未在 Multimap 中的键存储键值对时,Multimap 都会使用 Supplier。

      【讨论】:

      • 您知道供应商中的助记词吗?如果知道,也请提供样本。
      • @Emil: memoize 得到使用,例如here
      【解决方案3】:

      这是一种提供间接对象的方法。您可能希望在每次调用 Supplier.get() is 时提供另一个对象。

      例如,我有一个名为 SmtpMailSender 的单例类,它采用 smtp 服务器的主机名。但是,主机名可以在运行时更改,因此不是采用 String hostname,而是采用 Supplier&lt;String&gt; hostname

      【讨论】:

        【解决方案4】:

        【讨论】:

          【解决方案5】:

          类的另一个很好的用途是解耦——如果一个组件只使用另一个来获取一个值,那么不依赖于具体的实现,而是依赖于这个接口。

          无论如何,这里有一些示例代码:http://www.slideshare.net/tfnico/google-guava

          【讨论】:

            【解决方案6】:

            查看Suppliers 课程,我想那里的方法会以某种方式回答您的问题。

            【讨论】:

              猜你喜欢
              • 2014-05-08
              • 1970-01-01
              • 2023-03-27
              • 2011-03-30
              • 2018-07-07
              • 1970-01-01
              • 1970-01-01
              • 2021-08-03
              • 2017-04-27
              相关资源
              最近更新 更多