2011-08-22 13 views
6

Siempre he sabido que Singleton es "malo", pero solo ahora que he realizado el cambio a Java desde C++ he decidido encontrar una forma de evitarlos. A partir de un poco de lectura, he descubierto que Factories o Dependency Injection podrían hacer el trabajo, pero me gustaría obtener alguna confirmación al respecto.Uso de Dependency Injection como alternativa a Singletons

Como ejemplo, estaba a punto de escribir un singleton de AnimationCache que almacenara un Map<String, Animation>. Las diferentes clases deberían poder acceder a esta clase (básicamente) en cualquier lugar para que puedan cargar Animaciones de manera fácil y eficiente. Un ejemplo muy breve de cómo se vería el código equivalente con DI sería genial.

Además, ¿es Guice un buen marco para DI con aplicaciones que no son web? Utilicé Spring para el desarrollo web, pero no estoy tan seguro de que funcione para juegos.

+0

Spring DI no es solo para aplicaciones web. – gtiwari333

+0

Actualización: También es posible que desee considerar [CDI 2.0 - Contexts & Dependency Injection for Java] (http://cdi-spec.org). Estandarizado en [JSR 365] (https://jcp.org/en/jsr/detail?id=365) a partir de 2017-04. Diseñado para * ambos * Java SE y Java EE. –

+0

Esta pregunta y sus respuestas pueden ser relevantes para futuros lectores: https://stackoverflow.com/questions/130794/what-is-dependency-injection?rq=1 – Cypher

Respuesta

5

primavera y Guice hará muy bien. Yo personalmente prefiero a Guice para la inyección de dependencia pura, pero Spring ofrece mucho más.

El código sólo se vería así:

public class AnimationCacheClient { 

    private AnimationCache cache; 

    @Autowired // for Spring, or 
    @Inject // for Guice (but I think Spring also supports it now) 
    public AnimationCacheClient(AnimationCache cache) { 
     this.cache = cache; 
    } 

    // ... 
} 

Yo personalmente prefiero la inyección de constructor, pero también se puede utilizar la inyección de setter o inyección campo.

Tenga en cuenta que el propósito de DI no es tener "singletons fáciles", sin embargo. Su objetivo principal es hacer que el código (de AnimationCacheClient, aquí) sea unitario estable, al poder inyectar dependencias simuladas (aquí, una instancia simulada de AnimationCache).

+0

Gracias por el ejemplo de código. Eso parece bastante simple. Entonces, ¿estaba equivocado al suponer que Dependency Injection puede tomar el lugar de Singletons? Realmente estoy buscando una mejor manera para que el código tenga acceso a una clase que solo debería haber alguna vez. – Mitch

+0

No, no estabas equivocado. Por defecto, Spring beans son singletons. Guice beans son prototipos por defecto, pero pueden configurarse para ser singletons. Solo quería señalar que el objetivo principal de DI no es hacer que los singleton sean fáciles. Su objetivo principal es facilitar las pruebas. –

1

Hace poco 'contuve' este thread en Singleton y qué tan malo podría ser (o no) y qué puedes hacer para eludirlo. Bien vale la pena leer.

Cuestiones relacionadas