请解释使用接口供应商(在番石榴)与一个合适的例子。谷歌番石榴供应商示例
回答
Supplier
接口只是一个无参数函数的抽象,它返回一个值...它是一个获取某个对象的实例或实例的手段。既然它是如此普遍,它可以用于许多事情。 Jared解释了Multimaps
工厂如何利用它作为工厂来创建某种类型的值的新实例Collection
。
鉴于接口的简单性,它还允许通过将其包装在另一个以某种方式改变其行为的另一个Supplier
的行为的一个非常强大的装饰。记忆就是一个例子。我自己使用Suppliers.memoizeWithExpiration
方法作为一种简单的方法,使得某些数据在特定时间段内最多只能从服务器读取一次。
我还建议看看Guice以及Provider
界面是如何使用它的。 Provider
完全等同于Supplier
,它是Guice工作的核心。
Provider
允许用户定义创建给定类的新对象的自定义方式。用户可以编写一个get()
方法可以执行任何需要的代码来创建一个新的对象,所以它们不仅限于让Guice使用构造函数来创建对象。在这里,他们正在使用它为对象的新实例定义工厂的自定义。- Guice允许注入任何依赖关系的
Provider
。这可能会在每次调用get()
时返回一个新实例,或者它可能始终会返回单个实例或其中的任何实例,具体取决于Provider
所表示的绑定的作用域范围。这也允许依赖关系的“懒惰实例化”...在Provider
给出了一个类,而无需实际提前创建对象创建对象的手段。对象的一个实例不需要被创建,直到调用get()
。 - 如上所示,
Provider
S型在吉斯划定范围的基础。如果你看一看的Scope界面,你会发现它的一个方法Provider<T> scope(Key<T> key, Provider<T> unscoped)
中的Provider
条款定义。此方法需要东西,创建一个对象(在Provider<T> unscoped
)的一个新实例,并返回基于该施加任何政策的范围定义,有可能返回对象的一些缓存的实例,而不是创建一个新的一个Provider<T>
。默认的NO_SCOPE
范围只是沿着unscoped
提供者传递,这意味着每次都会创建一个新实例。该SINGLETON
范围缓存第一次调用unscoped.get()
的结果,然后返回单一实例,从而确保依赖于单范围的对象上的一切获取对单一对象的引用。请注意,由SINGLETON
范围内的方法返回的Provider
方法确实与方法相同与Suppliers.memoize
返回的Supplier
(尽管它稍微复杂一些)。
这是一种提供间接对象的方法。每次调用Supplier.get() is
时,您可能都想提供另一个对象。
例如,我有一个叫做SmtpMailSender
的单例类,它为smtp服务器提供一个主机名。但是,主机名可以在运行时更改,因此不需要执行String hostname
,而是需要Supplier<String> hostname
。
一个例子使用供应商:
见Suppliers类和我猜的方法会有莫名其妙地回答你的问题。
我们包括番石榴供应商的主要原因是支持Multimaps方法生成任意屈德宁,如
public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map,
Supplier<? extends Collection<V>> factory)
供应商创建一个包含给定键的所有值的集合。无论何时将键值对与不在Multimap中的键一起存储,Multimap都会使用供应商。
该类的另一个重要用途是解耦 - 如果一个组件只使用另一个组件获取值,则不依赖于具体实现,而是依赖于该接口。
无论如何,有一些示例代码在这里:http://www.slideshare.net/tfnico/google-guava
- 1. 在谷歌番石榴loadingCache
- 2. 谷歌番石榴RangeMap迭代顺序
- 3. 谷歌番石榴嵌套木匠
- 4. FileBackedOutputStream用例(番石榴)
- 5. 番石榴散列用例
- 6. Floats.tryParse()番石榴
- 7. 番石榴功能
- 8. 番石榴和Weblogic:ClassNotFoundException
- 9. 番石榴表ConcurrentModificationException
- 10. 番石榴资源
- 11. 番石榴入门
- 12. ClassNotFoundException的番石榴
- 13. 番石榴 - 地图支持番石榴功能
- 14. 谷歌番石榴函数提取了Map.Entry
- 15. 谷歌番石榴地图和Java的Util地图
- 16. 谷歌番石榴和错误我想不出
- 17. 谷歌App Engine的API - 番石榴依赖冲突
- 18. 解析日志使用谷歌番石榴
- 19. 番石榴库:有n个实例
- 20. 设置PITest为番石榴
- 21. 番石榴Multimap列表
- 22. 番石榴RateLimiter爆裂
- 23. 如何与CacheBuilder番石榴
- 24. 番石榴文件缓存
- 25. 链接到番石榴javadoc
- 26. 番石榴进口问题
- 27. 子类番石榴的ImmutableSet
- 28. 番石榴函数参数
- 29. 遍历表番石榴
- 30. 番石榴函数组合
你知道在供应商mnemonize如果是的话请给一个样吗?。 – Emil 2010-11-10 07:55:06
@Emil:'memoize'可以使用例如[这里](http://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java/3636791#3636791) – maaartinus 2011-09-14 08:27:59