Java 谷歌番石榴供应商示例

Java 谷歌番石榴供应商示例,java,guava,Java,Guava,请用合适的例子解释接口供应商(番石榴)的用法。这是一种提供间接对象的方法。每次调用Supplier.get()时,您可能需要提供另一个对象 例如,我有一个名为smtpmailssender的单例类,它接受smtp服务器的主机名。但是,主机名可以在运行时更改,因此它不采用字符串主机名,而是采用供应商主机名查看类,我想那里的方法会以某种方式回答您的问题。供应商的另一个示例使用: 我们将供应商纳入Guava的主要原因是支持生成任意多重地图的方法,例如 public static <K,V>

请用合适的例子解释接口供应商(番石榴)的用法。

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


例如,我有一个名为
smtpmailssender
的单例类,它接受smtp服务器的主机名。但是,主机名可以在运行时更改,因此它不采用
字符串主机名
,而是采用
供应商主机名
查看类,我想那里的方法会以某种方式回答您的问题。

供应商的另一个示例使用:


我们将供应商纳入Guava的主要原因是支持生成任意多重地图的方法,例如

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

SupplierSupplier
接口只是一个返回值的无参数函数的抽象……它是获取对象的一个或多个实例的一种方法。由于它非常通用,因此可以使用很多东西。Jared解释了
多映射
工厂如何将其用作创建对象的新实例的工厂值的某种类型的
集合

考虑到界面的简单性,它还允许通过将
供应商
包装在另一个
供应商
中,以某种方式改变其行为,从而对供应商的行为进行一些非常强大的修饰。记忆化就是一个例子。我自己也使用了
供应商。记忆化膨胀
方法,这是一种简单的方法某些数据在给定的时间段内最多只能从服务器读取一次

我还建议您了解一下Guice以及如何在其中使用
提供程序
接口。
提供程序
完全等同于
供应商
,是Guice工作的核心

  • Provider
    允许用户定义创建给定类的新对象的自定义方式。用户可以编写
    get()
    方法,该方法可以执行创建新对象所需的任何代码,因此它们不限于让Guice单独使用构造函数来创建对象。在这里,它们使用它为对象的新实例定义自定义工厂
  • Guice允许注入任何依赖项的
    提供程序
    。这可能会在每次调用
    get()
    时返回一个新实例,也可能总是返回一个实例或介于两者之间的任何内容,这取决于
    提供程序
    表示的绑定的范围。这还允许“延迟实例化”对于依赖项,
    Provider
    为类提供了一种创建对象的方法,而无需提前实际创建对象。在调用
    get()
    之前,不需要创建对象的实例
  • 如上所述,
    Provider
    s构成了Guice中作用域的基础。如果您查看该接口,您会注意到它的单个方法
    Provider scope(Key-Key,Provider unscoped)
    是根据
    Provider
    s定义的。该方法采用了创建对象新实例的内容(提供程序未指定范围
)并返回一个
提供程序
,该提供程序基于作用域定义的任何应用策略,可能会返回对象的一些缓存实例,而不是创建一个新实例。默认的
无作用域
作用域只会沿着
无作用域
提供程序传递,这意味着每次都会创建一个新实例LETON
scope缓存第一次调用
unscoped.get()的结果
然后返回该单个实例,确保依赖于单例作用域对象的所有对象都获得对该单个对象的引用。请注意,
singleton
scope的
scope
方法返回的
提供程序
返回的
供应商
的操作基本相同>Suppliers.memoize
(虽然有点复杂)
类的另一个重要用途是解耦-如果一个组件只使用另一个组件来获取值,则不依赖于具体实现,而是依赖于此接口


无论如何,这里有一些示例代码:

你知道供应商的记忆功能吗?如果知道,请也给出一个示例。@Emil:
memoize
get use例如。