2010-11-12 18 views
14

me gustaría preguntar cuál es la diferencia entreGuice: Diferencia entre Carpeta # bindConstant() y Cuaderno # bind() ... ToInstance

bindConstant().annotatedWith(Names.named("keepAliveInterval")).to(60); 

y

bind(Integer.TYPE).annotatedWith(Names.named("keepAliveInterval")).toInstance(60); 

me gustaría cargar todas mis propiedades de configuración con Names.bindProperties (binder(), prop); en mi módulo y descubrí que usa el último para las propiedades de enlace.

Gracias, que se refiere a

Marek

+0

+1 Estaba pensando en hacer algo similar. – Jeremy

Respuesta

10

Creo razones para usar bindConstant() son:

  • Se requiere el uso de un enlace anotada. No puedes hacer bindConstant().to(foo). Dado que los tipos que vincula con él son primitivos y String s, es poco probable que un enlace sin anotación tenga sentido para cualquiera de ellos.
  • Requiere menos esfuerzo ya que no tiene que especificar el tipo (por cierto, se une a un bindConstant()int a Integer.class en lugar de Integer.TYPE, no está seguro de si lo que importa).

creo Names.bindProperties no utiliza bindConstant sólo porque es el código interno y un poco más de código está OK para omitir uno o dos pasos en el proceso de hacer una unión. En sus propios módulos, solo usaría bindConstant porque es fácil y más claro.

3

bindConstant() tiene la ventaja de ser capaz de establecer diferentes primitivas debido a las instancias predefinidas de TypeConverter dentro de Guice.

Tome la siguiente definición de unión como un ejemplo:

bindContant().annotatedWith(@Names.named("c")).to("30");

Luego, en una clase en la que desea la inyección:

@Inject @Named("c") int value;

Guice convertirá el obligado String en un int para ti. Si no puede, lo dirá.

El beneficio de bindConstant() es la conversión de tipo que puede suceder. Explícitamente vinculante un int no le da ese lujo.

+1

Como lo demuestra cómo 'bindProperties()' no utiliza 'bindConstant()', esto no es completamente cierto. Usar 'bind (String.class) ... .toInstance (" 30 ")' funciona bien y permite que el enlace se convierta en un 'int' justo como' bindConstant() '. No creo que a las cosas de 'TypeConverter' les importe cómo empezaste la vinculación. – ColinD

+0

Bueno, como mencioné en mi OP, Names.bindProperties no utiliza bindConstant y, sin embargo, se produce la conversión de tipo (por ejemplo, el host y el puerto son String e int, y ambos se inyectan correctamente como los tipos que son, sin errores de conversión) – zeratul021

+1

Es verdad, no es así. Sin embargo, desde el punto de vista del usuario, eso debe tenerse en cuenta porque es la lógica interna de Guice. – gpampara

Cuestiones relacionadas