Explique el uso de la interfaz Proveedor (en Guava) con un ejemplo adecuado.Google Guava Ejemplo de proveedor
Respuesta
La interfaz Supplier
es simplemente una abstracción de una función sin argumentos que devuelve un valor ... es un medios de conseguir alguna instancia o instancias de un objeto. Como es tan general, se puede usar como muchas cosas. Jared explicó cómo las fábricas Multimaps
lo utilizan como una fábrica para crear una nueva instancia de un Collection
de algún tipo para los valores.
Dada la simplicidad de la interfaz, también permite una decoración muy poderosa del comportamiento de Supplier
envolviéndolo en otro Supplier
que altera su comportamiento de alguna manera. La memoria es un ejemplo de eso. He usado el método Suppliers.memoizeWithExpiration
como una forma fácil de hacerlo, por lo que algunos datos solo se leerán de un servidor como máximo una vez en un período de tiempo determinado.
También recomendaría echarle un vistazo a Guice y cómo se usa la interfaz Provider
. Provider
es exactamente equivalente a Supplier
y es fundamental para el funcionamiento de Guice.
Provider
permite a los usuarios definir una forma personalizada de crear nuevos objetos de una clase determinada. Los usuarios pueden escribir un métodoget()
que puede ejecutar cualquier código que se necesite para crear un nuevo objeto, por lo que no están limitados a tener a los constructores de uso de Guice solos para crear objetos. Aquí, lo están usando para definir una fábrica personalizada para la nueva instancia de un objeto.- Guice permite la inyección de un
Provider
de cualquier dependencia. Esto puede devolver una nueva instancia cada vez que se llamaget()
o siempre puede devolver una sola instancia o cualquier cosa intermedia, dependiendo de cómo se ve el enlace que representa elProvider
. Esto también permite la "instanciación diferida" de dependencias ...elProvider
da a una clase un medio de crear un objeto sin necesidad de crear realmente el objeto antes de tiempo. No es necesario crear una instancia del objeto hasta que se llame aget()
y cuándo. - Como se indicó anteriormente,
Provider
s forman la base del alcance en Guice. Si echa un vistazo a la interfaz Scope, notará que su único métodoProvider<T> scope(Key<T> key, Provider<T> unscoped)
se define en términos deProvider
s. Este método toma algo que crea una nueva instancia de un objeto (Provider<T> unscoped
) y devuelveProvider<T>
en función de lo que aplica cualquier política que define el alcance, devolviendo potencialmente alguna instancia en caché del objeto en lugar de crear una nueva. El ámbito predeterminadoNO_SCOPE
simplemente pasa junto con el proveedorunscoped
, lo que significa que se creará una nueva instancia cada vez. El ámbitoSINGLETON
almacena en caché el resultado de la primera llamada alunscoped.get()
y, a partir de ese momento, devuelve esa instancia única, lo que garantiza que todo lo que depende del objeto con ámbito singleton obtiene una referencia a ese único objeto. Tenga en cuenta que laProvider
devuelto por el método del alcanceSINGLETON
scope
hace esencialmente la misma cosa como elSupplier
devuelto porSuppliers.memoize
(aunque es un poco más complicado).
Es una forma de proporcionar un objeto indirecto. Es posible que desee proporcionar otro objeto cada vez que se llame al Supplier.get() is
.
Por ejemplo, tengo una clase singleton llamada SmtpMailSender
, que toma un nombre de host para el servidor smtp. Sin embargo, el nombre de host puede cambiar en tiempo de ejecución, por lo que en lugar de tomar un String hostname
, toma un Supplier<String> hostname
.
Un ejemplo de uso del suministrador:
consulte la clase Suppliers y supongo que los métodos no habrá alguna manera responder a su pregunta.
Otro ejemplo de uso de Proveedor:
http://javawayoflife.blogspot.com/2010/06/unit-test-and-new-date.html
La razón principal por la que incluimos Proveedor de guayaba era apoyar los Multimaps métodos que generan Multimapas arbitraria, como
public static <K,V> Multimap<K,V> newMultimap(Map<K,Collection<V>> map,
Supplier<? extends Collection<V>> factory)
crea El Proveedor una Colección que contiene todos los valores para una clave dada. Multimap utiliza al proveedor cada vez que almacena un par de clave-valor con una clave que no está ya en el Multimap.
Otro gran uso de la clase es el desacoplamiento: si un componente solo usa otro para obtener un valor, no dependa de la implementación concreta, sino de esta interfaz.
De todos modos, hay un código de ejemplo aquí: http://www.slideshare.net/tfnico/google-guava
- 1. Google Guava Tutorial de servicio o ejemplos?
- 2. Uso de Google Guava con Android 1.6
- 3. ¿Cómo uso Throwables.propagateIfInstanceOf() de Google Guava?
- 4. Google Guava/proporcionar implementaciones de tipo colección funcional
- 5. Ejemplo del proveedor de servicios DotNetOpenAuth MVC 3
- 6. Filtrar una lista de JavaBeans con Google Guava
- 7. proveedor de motor de aplicación google oauth2
- 8. ¿Cómo manejar las excepciones de actualización de Google Guava Cache?
- 9. Cómo crear una versión sincronizada de TreeMultimap de Google Guava
- 10. Google Guice: Proveedor con los parámetros
- 11. ¿Es Google Guava "más difícil" de usar que Apache Collections?
- 12. Proveedor de contenido y ejemplo de observador de contenido?
- 13. Ejemplo de proveedor de credenciales de Windows 7
- 14. Ejemplo de código .NET para un proveedor de identidad SAML
- 15. Google Collections (Guava Libraries): ImmutableSet/List/Map and Filtering
- 16. Clasificación insensible a mayúsculas/minúsculas con Google Guava
- 17. dominio de Google Apps como proveedor de OpenID
- 18. Google OAuth2 ejemplo de línea de comandos
- 19. Guava: ¿Dónde está CharEscaper?
- 20. Guava concurrency tutorials/code
- 21. Usando Guava con GWT
- 22. App Engine Google archivo estático manipuladores ejemplo
- 23. ¿Existe alguna forma concisa de crear un InputSupplier para un InputStream en Google Guava?
- 24. Recursos para la Guava
- 25. Servicio reiniciable utilizando Guava
- 26. Filtrado Guava Multimaps
- 27. Guava: Throwables.propagate e InterruptedException
- 28. Guava MultiMap y ConcurrentModificationException
- 29. inicializando una ImmutableMap de Guava
- 30. es guava-libraries disponible en maven repo?
sabe usted de mnemonize de proveedores Si es así por favor, dar una muestra para eso también?. – Emil
@Emil: 'memoize' se usa, p. [aquí] (http://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java/3636791#3636791) – maaartinus