2010-10-25 86 views

回答

37

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(尽管它稍微复杂一些)。
7

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

例如,我有一个叫做SmtpMailSender的单例类,它为smtp服务器提供一个主机名。但是,主机名可以在运行时更改,因此不需要执行String hostname,而是需要Supplier<String> hostname

0

Suppliers类和我猜的方法会有莫名其妙地回答你的问题。

14

我们包括番石榴供应商的主要原因是支持Multimaps方法生成任意屈德宁,如

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

供应商创建一个包含给定键的所有值的集合。无论何时将键值对与不在Multimap中的键一起存储,Multimap都会使用供应商。

+0

你知道在供应商mnemonize如果是的话请给一个样吗?。 – Emil 2010-11-10 07:55:06

+1

@Emil:'memoize'可以使用例如[这里](http://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java/3636791#3636791) – maaartinus 2011-09-14 08:27:59

1

该类的另一个重要用途是解耦 - 如果一个组件只使用另一个组件获取值,则不依赖于具体实现,而是依赖于该接口。

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