Col*_*inD 41
该Supplier接口是只是一个返回值无参数的函数的抽象......它是一种获得一个物体的一些实例或实例的方式.由于它如此通用,它可以用于很多东西.Jared解释了Multimaps工厂如何利用它作为工厂来创建Collection某种类型的价值的新实例.
鉴于界面的简单性,它还允许Supplier通过将其包装在另一个Supplier以某种方式改变其行为的非常强大的行为装饰.记忆就是其中的一个例子.我自己使用这种Suppliers.memoizeWithExpiration方法作为一种简单的方法,因此一些数据只能在给定的时间内从服务器读取一次.
我还建议你看一下Guice以及Provider界面的使用方法.与Guice的工作原理Provider完全相同Supplier并且是其核心.
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>根据范围定义的任何策略返回a ,可能返回对象的某个缓存实例而不是创建新实例.默认NO_SCOPE范围只是传递给unscoped提供者,这意味着每次都会创建一个新实例.该SINGLETON范围缓存第一次调用的结果unscoped.get()然后返回该单个实例,确保依赖于单例范围对象的所有内容都获得对该单个对象的引用.需要注意的是,Provider通过返回的SINGLETON范围的scope方法做本质上是一回事作为Supplier由归国Suppliers.memoize(虽然这是一个比较复杂).Jar*_*evy 14
我们在Guava中包含Supplier的主要原因是支持生成任意Multimaps 的Multimaps方法,例如
public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map,
Supplier<? extends Collection<V>> factory)
Run Code Online (Sandbox Code Playgroud)
供应商创建一个Collection,其中包含给定键的所有值.只要您使用Multimap中尚未存在的键存储键值对,Multimap就会使用Supplier.
这是一种提供间接对象的方法.您可能希望每次Supplier.get() is调用时提供另一个对象.
例如,我有一个名为singleton的类SmtpMailSender,它接受smtp服务器的主机名.但是,主机名可以在运行时更改,因此String hostname它不需要a,而是需要a Supplier<String> hostname.