2011-08-22 11 views
6

Ho sempre conosciuto Singletons come "cattivo", ma solo ora che ho fatto il passaggio a Java da C++ ho deciso di trovare un modo per aggirarli. Da un po 'di lettura, ho scoperto che sia le Fabbriche che l'Iniezione delle Dipendenze potrebbero fare il lavoro, ma vorrei una conferma su questo.Uso dell'iniezione delle dipendenze in alternativa a Singletons

Come esempio, stavo per scrivere un singleton AnimationCache che memorizzerebbe uno Map<String, Animation>. Diverse classi dovrebbero essere in grado di accedere a questa classe (fondamentalmente) ovunque in modo che possano caricare animazioni in modo facile ed efficiente. Un esempio molto breve di come sarebbe il codice equivalente con DI sarebbe fantastico.

Inoltre, Guice è un buon framework per DI con app non web? Ho usato Spring per lo sviluppo web, ma non sono così sicuro che funzionerebbe per i giochi.

+0

Spring DI non è solo per applicazioni web. Aggiornamento – gtiwari333

+0

: Si potrebbe anche prendere in considerazione [CDI 2.0 - Contexts & Dependency Injection per Java] (http://cdi-spec.org). Standardizzato in [JSR 365] (https://jcp.org/en/jsr/detail?id=365) a partire dal 2017-04. Progettato per * sia * Java SE che Java EE. –

+0

Questa domanda e le sue risposte potrebbero essere pertinenti per i futuri lettori: https://stackoverflow.com/questions/130794/what-is-dependency-injection?rq=1 – Cypher

risposta

5

primavera e Guice farà bene. Personalmente, preferisco Guice per un'iniezione di dipendenza pura, ma Spring offre molto di più.

Il codice sarebbe solo simile a questa:

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; 
    } 

    // ... 
} 

io personalmente preferisco iniezione costruttore, ma si potrebbe anche usare l'iniezione setter o iniezione campo.

Si noti che lo scopo di DI non è di avere "semplici singleton", però. Il suo scopo principale è quello di rendere il codice (di AnimationCacheClient, qui) facilmente unità-estabile, essendo in grado di iniettare dipendenze fittizie (qui, una finta istanza AnimationCache).

+0

Grazie per il codice di esempio. Sembra abbastanza semplice. Quindi ho sbagliato a supporre che la dipendenza dall'iniezione possa prendere il posto di Singletons? Sto davvero cercando un modo migliore per il codice di avere accesso a una classe che dovrebbe essere sempre e solo una. – Mitch

+0

No, non ti sbagliavi. Per impostazione predefinita, i bean Spring sono singleton. I bean Guice sono prototipi di default ma possono essere configurati per essere singleton. Volevo solo sottolineare che l'obiettivo principale di DI non è quello di rendere facili i singleton. Il suo obiettivo principale è rendere i test facili. –

1

Recentemente ho "conorato" questo thread su Singleton e quanto male potrebbe essere (o meno) e cosa si può fare per aggirarlo. Vale la pena leggere.