インターフェースサプライヤー(グアバ)の使用法を適切な例とともに説明してください。
Supplier
インターフェースは、単に値を返す引数なしの関数の抽象化です...これは、オブジェクトのインスタンスを取得する手段です。汎用性が高いので、色々な使い方ができます。 Jaredは、Multimaps
ファクトリが値のいくつかのタイプのCollection
の新しいインスタンスを作成するためのファクトリとしてどのようにそれを利用するかを説明しました。
インターフェースが単純であることを考えると、それはまた、何らかの方法で動作を変更する別のSupplier
でラップすることにより、Supplier
の動作の非常に強力な装飾を可能にします。メモ化はその一例です。自分で_Suppliers.memoizeWithExpiration
_メソッドを簡単な方法として使用して、一部のデータが特定の期間に最大で1回だけサーバーから読み取られるようにしました。
また、GuiceとProvider
インターフェースがどのように使用されているかを確認することもお勧めします。 Provider
はSupplier
とまったく同じで、Guiceの動作の中心となります。
Provider
を使用すると、ユーザーは特定のクラスの新しいオブジェクトを作成するカスタムの方法を定義できます。ユーザーは、新しいオブジェクトを作成するために必要なコードを実行できるget()
メソッドを記述できるため、Guiceがコンストラクターだけを使用してオブジェクトを作成することに限定されません。ここでは、オブジェクトの新しいインスタンスのカスタムfactoryを定義するためにそれを使用しています。Provider
の注入を許可します。これは、Provider
が表すバインディングのスコープに応じて、get()
が呼び出されるたびに新しいインスタンスを返すか、常に単一のインスタンスまたはその間の何かを返します。これにより、依存関係の「遅延インスタンス化」も可能になります... Provider
は、クラスにオブジェクトを作成する手段を提供します必要はありません実際にオブジェクトを事前に作成します。オブジェクトのインスタンスは、get()
が呼び出されるまで、および呼び出されるまで作成する必要はありません。Provider
sはGuiceのスコープの基礎を形成します。 Scope インターフェースを見ると、その単一のメソッドProvider<T> scope(Key<T> key, Provider<T> unscoped)
がProvider
sの観点から定義されていることがわかります。このメソッドはオブジェクトの新しいインスタンスを作成するもの(_Provider<T> unscoped
_)を取り、それに基づいて_Provider<T>
_を返しますスコープが定義するポリシーを適用し、新しいインスタンスを作成するのではなく、オブジェクトのキャッシュされたインスタンスを返す可能性があります。デフォルトの_NO_SCOPE
_スコープは単にunscoped
プロバイダーを渡します。つまり、毎回新しいインスタンスが作成されます。 SINGLETON
スコープは、unscoped.get()
への最初の呼び出しの結果をキャッシュしてから、その単一のインスタンスを返し、シングルトンスコープのオブジェクトに依存するすべてのものがその単一のオブジェクトへの参照を取得するようにします。 Provider
スコープのSINGLETON
メソッドによって返されるscope
は基本的に同じことを実行することに注意してください。 _Suppliers.memoize
_から返されるSupplier
(少し複雑ですが)。Guavaにサプライヤーを含めた主な理由は、次のような任意のマルチマップを生成する Multimaps メソッドをサポートするためでした
public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map,
Supplier<? extends Collection<V>> factory)
サプライヤは、指定されたキーのすべての値を保持するコレクションを作成します。マルチマップには、まだマルチマップに存在しないキーを持つキーと値のペアを保存するときはいつでも、サプライヤーが使用されます。
これは、間接オブジェクトを提供する方法です。 Supplier.get() is
が呼び出されるたびに別のオブジェクトを提供したい場合があります。
たとえば、SmtpMailSender
というシングルトンクラスがあります。これは、smtpサーバーのホスト名を取ります。ただし、ホスト名は実行時に変更される可能性があるため、String hostname
、それはSupplier<String> hostname
。
サプライヤーの使用例:
クラスのもう1つの優れた用途は分離です。コンポーネントが値を取得するためだけに使用する場合は、具体的な実装に依存せず、このインターフェースに依存します。
とにかく、ここにいくつかのサンプルコードがあります: http://www.slideshare.net/tfnico/google-guava
Suppliers クラスを参照してください。そこにあるメソッドがどういうわけかあなたの質問に答えると思います。