【发布时间】:2010-10-25 12:38:07
【问题描述】:
请用合适的例子说明Supplier(in Guava)接口的使用。
【问题讨论】:
请用合适的例子说明Supplier(in Guava)接口的使用。
【问题讨论】:
Supplier 接口只是一个返回值的无参数函数的抽象......它是一种获取对象的一些实例或实例的方法。由于它是如此通用,它可以用于许多东西。 Jared 解释了 Multimaps 工厂如何将其用作工厂来创建某种类型的 Collection 的新实例以获取值。
鉴于界面的简单性,它还允许通过将Supplier 包装在另一个Supplier 中以某种方式改变其行为来对Supplier 的行为进行一些非常强大的修饰。记忆就是其中的一个例子。我自己使用了Suppliers.memoizeWithExpiration 方法作为一种简单的方法来实现它,因此在给定的时间段内,某些数据最多只能从服务器读取一次。
我还建议您查看 Guice 以及如何在其中使用 Provider 接口。 Provider 完全等同于 Supplier,并且是 Guice 工作方式的核心。
Provider 允许用户定义创建给定类的新对象的自定义方式。用户可以编写一个get() 方法,该方法可以执行创建新对象所需的任何代码,因此他们不限于让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 方法返回的Provider 与Suppliers.memoize 返回的Supplier 的作用基本相同(虽然它有点复杂)。李>
【讨论】:
我们在 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。
【讨论】:
memoize 得到使用,例如here
这是一种提供间接对象的方法。您可能希望在每次调用 Supplier.get() is 时提供另一个对象。
例如,我有一个名为 SmtpMailSender 的单例类,它采用 smtp 服务器的主机名。但是,主机名可以在运行时更改,因此不是采用 String hostname,而是采用 Supplier<String> hostname。
【讨论】:
【讨论】:
类的另一个很好的用途是解耦——如果一个组件只使用另一个来获取一个值,那么不依赖于具体的实现,而是依赖于这个接口。
无论如何,这里有一些示例代码:http://www.slideshare.net/tfnico/google-guava
【讨论】:
查看Suppliers 课程,我想那里的方法会以某种方式回答您的问题。
【讨论】: