2010-10-25 15 views

Respuesta

37

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étodo get() 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 llama get() o siempre puede devolver una sola instancia o cualquier cosa intermedia, dependiendo de cómo se ve el enlace que representa el Provider. Esto también permite la "instanciación diferida" de dependencias ...el Provider 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 a get() 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étodo Provider<T> scope(Key<T> key, Provider<T> unscoped) se define en términos de Provider s. Este método toma algo que crea una nueva instancia de un objeto (Provider<T> unscoped) y devuelve Provider<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 predeterminado NO_SCOPE simplemente pasa junto con el proveedor unscoped, lo que significa que se creará una nueva instancia cada vez. El ámbito SINGLETON almacena en caché el resultado de la primera llamada al unscoped.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 la Provider devuelto por el método del alcance SINGLETONscope hace esencialmente la misma cosa como el Supplier devuelto por Suppliers.memoize (aunque es un poco más complicado).
7

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.

0

consulte la clase Suppliers y supongo que los métodos no habrá alguna manera responder a su pregunta.

14

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.

+0

sabe usted de mnemonize de proveedores Si es así por favor, dar una muestra para eso también?. – Emil

+1

@Emil: 'memoize' se usa, p. [aquí] (http://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java/3636791#3636791) – maaartinus

1

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

Cuestiones relacionadas