web-dev-qa-db-fra.com

Exemple de fournisseur de Google Guava

Veuillez expliquer l'utilisation de l'interface Fournisseur (en Guava) avec un exemple approprié.

34
Emil

L'interface Supplier est simplement une abstraction d'une fonction sans argument qui renvoie une valeur ... c'est un moyen d'obtenir une ou plusieurs instances d'un objet . Puisqu'il est si général, il peut être utilisé comme autant de choses. Jared a expliqué comment les usines Multimaps l'utilisent comme usine pour créer une nouvelle instance d'un Collection d'un certain type pour les valeurs.

Étant donné la simplicité de l'interface, il permet également une décoration très puissante du comportement d'un Supplier en l'enveloppant dans un autre Supplier qui modifie son comportement d'une manière ou d'une autre. La mémorisation en est un exemple. J'ai moi-même utilisé la méthode Suppliers.memoizeWithExpiration Comme un moyen simple de le faire pour que certaines données ne soient lues sur un serveur au plus qu'une fois au cours d'une période donnée.

Je recommanderais également de jeter un œil à Guice et à la façon dont l'interface Provider y est utilisée. Provider est exactement équivalent à Supplier et est au cœur du fonctionnement de Guice.

  • Provider permet aux utilisateurs de définir une manière personnalisée de créer de nouveaux objets d'une classe donnée. Les utilisateurs peuvent écrire une méthode get() qui peut exécuter tout le code nécessaire pour créer un nouvel objet, ils ne sont donc pas limités à ce que Guice utilise des constructeurs seuls pour créer des objets. Ici, ils l'utilisent pour définir une fabrique personnalisée pour la nouvelle instance d'un objet.
  • Guice permet l'injection d'un Provider de n'importe quelle dépendance. Cela peut renvoyer une nouvelle instance chaque fois que get() est appelée ou il peut toujours renvoyer une seule instance ou quoi que ce soit entre les deux, selon la façon dont la liaison représentée par Provider est étendue. Cela permet également une "instanciation paresseuse" des dépendances ... le Provider donne à une classe un moyen de créer un objet sans avoir besoin de créer réellement l'objet à l'avance. Il n'est pas nécessaire de créer une instance de l'objet tant que, quand et si get() est appelé.
  • Comme indiqué ci-dessus, Providers constituent la base de la portée de Guice. Si vous jetez un œil à l'interface Scope , vous remarquerez que sa méthode unique Provider<T> scope(Key<T> key, Provider<T> unscoped) est définie en termes de Providers. Cette méthode prend quelque chose qui crée une nouvelle instance d'un objet (le Provider<T> unscoped) Et renvoie un Provider<T> Basé sur celle qui applique la politique définie par la portée, renvoyant potentiellement une instance mise en cache de l'objet plutôt que d'en créer une nouvelle. La portée par défaut NO_SCOPE Passe simplement le long du fournisseur unscoped, ce qui signifie qu'une nouvelle instance sera créée à chaque fois. La portée SINGLETON met en cache le résultat du premier appel à unscoped.get() et renvoie ensuite cette instance unique, garantissant que tout ce qui dépend de l'objet à portée singleton obtient une référence à cet objet unique. Notez que la Provider retournée par la méthode SINGLETON de la portée scope de la portée fait essentiellement la même chose que le Supplier renvoyé par Suppliers.memoize (bien que ce soit un peu plus compliqué).
41
ColinD

La raison principale pour laquelle nous avons inclus Supplier dans Guava était de prendre en charge les méthodes Multimaps qui génèrent des Multimaps arbitraires, telles que

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

Le fournisseur crée une collection qui contient toutes les valeurs d'une clé donnée. Le Multimap utilise le fournisseur chaque fois que vous stockez une paire clé-valeur avec une clé qui n'est pas déjà dans le Multimap.

14
Jared Levy

C'est une façon de fournir un objet indirect. Vous souhaiterez peut-être fournir un autre objet chaque fois que Supplier.get() is sera appelée.

Par exemple, j'ai une classe singleton appelée SmtpMailSender, qui prend un nom d'hôte pour le serveur smtp. Cependant, le nom d'hôte peut changer au moment de l'exécution, donc au lieu de prendre un String hostname, il faut un Supplier<String> hostname.

Un autre exemple d'utilisation du fournisseur:

http://javawayoflife.blogspot.com/2010/06/unit-test-and-new-date.html

3
amertum

Un exemple d'utilisation du fournisseur:

Cache thread-safe d'un objet en Java

2
Gareth Davis

Un autre grand usage de la classe est le découplage - si un composant n'en utilise qu'un autre pour obtenir une valeur, ne dépend pas de l'implémentation concrète, mais de cette interface.

Quoi qu'il en soit, il y a un exemple de code ici: http://www.slideshare.net/tfnico/google-guava

1
thSoft

Voir la classe Fournisseurs et je suppose que les méthodes y répondront en quelque sorte à votre question.

0
nanda