web-dev-qa-db-ja.com

Google Guavaサプライヤーの例

インターフェースサプライヤー(グアバ)の使用法を適切な例とともに説明してください。

34
Emil

Supplierインターフェースは、単に値を返す引数なしの関数の抽象化です...これは、オブジェクトのインスタンスを取得する手段です。汎用性が高いので、色々な使い方ができます。 Jaredは、Multimapsファクトリが値のいくつかのタイプのCollectionの新しいインスタンスを作成するためのファクトリとしてどのようにそれを利用するかを説明しました。

インターフェースが単純であることを考えると、それはまた、何らかの方法で動作を変更する別のSupplierでラップすることにより、Supplierの動作の非常に強力な装飾を可能にします。メモ化はその一例です。自分で_Suppliers.memoizeWithExpiration_メソッドを簡単な方法として使用して、一部のデータが特定の期間に最大で1回だけサーバーから読み取られるようにしました。

また、GuiceとProviderインターフェースがどのように使用されているかを確認することもお勧めします。 ProviderSupplierとまったく同じで、Guiceの動作の中心となります。

  • Providerを使用すると、ユーザーは特定のクラスの新しいオブジェクトを作成するカスタムの方法を定義できます。ユーザーは、新しいオブジェクトを作成するために必要なコードを実行できるget()メソッドを記述できるため、Guiceがコンストラクターだけを使用してオブジェクトを作成することに限定されません。ここでは、オブジェクトの新しいインスタンスのカスタムfactoryを定義するためにそれを使用しています。
  • Guiceは、依存関係のProviderの注入を許可します。これは、Providerが表すバインディングのスコープに応じて、get()が呼び出されるたびに新しいインスタンスを返すか、常に単一のインスタンスまたはその間の何かを返します。これにより、依存関係の「遅延インスタンス化」も可能になります... Providerは、クラスにオブジェクトを作成する手段を提供します必要はありません実際にオブジェクトを事前に作成します。オブジェクトのインスタンスは、get()が呼び出されるまで、および呼び出されるまで作成する必要はありません。
  • 上記のように、ProvidersはGuiceのスコープの基礎を形成します。 Scope インターフェースを見ると、その単一のメソッドProvider<T> scope(Key<T> key, Provider<T> unscoped)Providersの観点から定義されていることがわかります。このメソッドはオブジェクトの新しいインスタンスを作成するもの(_Provider<T> unscoped_)を取り、それに基づいて_Provider<T>_を返しますスコープが定義するポリシーを適用し、新しいインスタンスを作成するのではなく、オブジェクトのキャッシュされたインスタンスを返す可能性があります。デフォルトの_NO_SCOPE_スコープは単にunscopedプロバイダーを渡します。つまり、毎回新しいインスタンスが作成されます。 SINGLETONスコープは、unscoped.get()への最初の呼び出しの結果をキャッシュしてから、その単一のインスタンスを返し、シングルトンスコープのオブジェクトに依存するすべてのものがその単一のオブジェクトへの参照を取得するようにします。 ProviderスコープのSINGLETONメソッドによって返されるscope基本的に同じことを実行することに注意してください。 _Suppliers.memoize_から返されるSupplier(少し複雑ですが)。
41
ColinD

Guavaにサプライヤーを含めた主な理由は、次のような任意のマルチマップを生成する Multimaps メソッドをサポートするためでした

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

サプライヤは、指定されたキーのすべての値を保持するコレクションを作成します。マルチマップには、まだマルチマップに存在しないキーを持つキーと値のペアを保存するときはいつでも、サプライヤーが使用されます。

14
Jared Levy

これは、間接オブジェクトを提供する方法です。 Supplier.get() isが呼び出されるたびに別のオブジェクトを提供したい場合があります。

たとえば、SmtpMailSenderというシングルトンクラスがあります。これは、smtpサーバーのホスト名を取ります。ただし、ホスト名は実行時に変更される可能性があるため、String hostname、それはSupplier<String> hostname

3
amertum
2
Gareth Davis

クラスのもう1つの優れた用途は分離です。コンポーネントが値を取得するためだけに使用する場合は、具体的な実装に依存せず、このインターフェースに依存します。

とにかく、ここにいくつかのサンプルコードがあります: http://www.slideshare.net/tfnico/google-guava

1
thSoft

Suppliers クラスを参照してください。そこにあるメソッドがどういうわけかあなたの質問に答えると思います。

0
nanda