请使用适当的示例解释接口供应商(在番石榴中)的使用。
答案 0 :(得分:41)
Supplier
接口只是一个返回值的无参数函数的抽象...它是获取某个实例或对象实例的方法。由于它如此通用,它可以用于很多东西。 Jared解释了Multimaps
工厂如何将其用作工厂,为值创建某种类型Collection
的新实例。
鉴于界面的简单性,它还允许对Supplier
行为进行一些非常强大的装饰,方法是将其包装在另一个以某种方式改变其行为的Supplier
中。记忆就是其中的一个例子。我自己使用Suppliers.memoizeWithExpiration
方法作为一种简单的方法,因此一些数据只能在给定的时间内从服务器读取一次。
我还建议您查看Guice以及如何使用Provider
接口。 Provider
完全等同于Supplier
,并且是Guice工作方式的核心。
Provider
允许用户定义创建给定类的新对象的自定义方式。用户可以编写get()
方法,该方法可以执行创建新对象所需的任何代码,因此它们不仅限于让Guice单独使用构造函数来创建对象。在这里,他们使用它为对象的新实例定义自定义 factory 。Provider
任何依赖项。每次调用get()
时,这可能会返回一个新实例,或者它可能总是返回单个实例或介于两者之间的任何内容,具体取决于Provider
表示的绑定的作用域。这也允许依赖项的“延迟实例化”...... Provider
为类创建一个创建对象的方法,而无需提前实际创建对象。在调用get()
时,不需要创建对象的实例。Provider
构成了Guice范围界定的基础。如果您查看Scope界面,您会发现其单一方法Provider<T> scope(Key<T> key, Provider<T> unscoped)
是根据Provider
来定义的。此方法使用创建对象的新实例(Provider<T> unscoped
)并根据范围定义的任何策略返回Provider<T>
,可能返回一些缓存对象的实例而不是创建新对象。默认NO_SCOPE
范围只是传递unscoped
提供程序,这意味着每次都会创建一个新实例。 SINGLETON
范围将第一次调用的结果缓存到unscoped.get()
,然后返回该单个实例,确保依赖于单例范围对象的所有内容都获得对该单个对象的引用。请注意,Provider
范围的SINGLETON
方法返回的scope
与Supplier
返回的Suppliers.memoize
基本上相同(虽然它有点复杂)。答案 1 :(得分:14)
我们将供应商纳入Guava的主要原因是支持生成任意Multimaps的Multimaps方法,例如
public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map,
Supplier<? extends Collection<V>> factory)
供应商创建一个包含给定密钥的所有值的集合。只要您将键值对与Multimap中尚未存在的键存储在一起,Multimap就会使用供应商。
答案 2 :(得分:7)
这是一种提供间接对象的方法。您可能希望每次Supplier.get() is
调用时提供另一个对象。
例如,我有一个名为SmtpMailSender
的单例类,它接受smtp服务器的主机名。但是,主机名可以在运行时更改,因此不需要String hostname
,而是Supplier<String> hostname
。
答案 3 :(得分:3)
答案 4 :(得分:2)
供应商的示例用法:
答案 5 :(得分:1)
该类的另一个重要用途是解耦 - 如果组件仅使用另一个组件来获取值,则不依赖于具体实现,而是依赖于此接口。
无论如何,这里有一些示例代码:http://www.slideshare.net/tfnico/google-guava
答案 6 :(得分:0)
参见Suppliers课程,我想那里的方法会以某种方式回答你的问题。