2011-08-22 16 views
6

Zawsze wiedziałem, że Singletony są "złe", ale dopiero teraz, gdy zrobiłem przejście na Javę z C++, postanowiłem znaleźć sposób na ich obejście. Z odrobiny lektury odkryłem, że albo Fabryki, albo Inwencja Dependencji mogą wykonać tę pracę, ale chciałbym potwierdzić to.Używanie Injection Dependency jako alternatywy dla Singletonów

Jako przykład, miałem zamiar napisać singleton AnimationCache, który będzie przechowywać Map<String, Animation>. Różne klasy powinny mieć dostęp do tej klasy (w zasadzie) w dowolnym miejscu, aby mogły łatwo i wydajnie ładować animacje. Bardzo krótki przykład tego, jak mógłby wyglądać równoważny kod przy użyciu DI, byłby świetny.

Czy Guice stanowi dobre środowisko dla DI z aplikacjami innymi niż internetowe? Użyłem Springa do tworzenia stron internetowych, ale nie jestem pewny, czy zadziałałoby w przypadku gier.

+0

Spring DI to nie tylko aplikacje internetowe. – gtiwari333

+0

Aktualizacja: Możesz również rozważyć [CDI 2.0 - Contexts & Dependency Injection for Java] (http://cdi-spec.org). Standaryzowane w [JSR 365] (https://jcp.org/en/jsr/detail?id=365) od 2017-04. Zaprojektowany dla * obu * Java SE i Java EE. –

+0

To pytanie i odpowiedzi mogą być istotne dla przyszłych czytelników: https://stackoverflow.com/questions/130794/what-is-dependency-injection?rq=1 – Cypher

Odpowiedz

5

wiosny i Guice zrobi dobrze. Osobiście wolę Guice za czysty wtrysk zależności, ale Spring oferuje znacznie więcej.

Kod po prostu wyglądać następująco:

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

    // ... 
} 

I personnally wolą konstruktora wtrysku, ale można też użyć seter zastrzyk lub zastrzyk pola.

Należy pamiętać, że celem DI nie jest posiadanie "łatwych singletonów". Jego głównym celem jest uczynienie kodu (z AnimationCacheClient, tutaj) łatwo znośnego, poprzez możliwość wstrzykiwania pozorowanych zależności (tutaj, fałszywa instancja AnimationCache).

+0

Dzięki za próbkę kodu. Wygląda to dość prosto. Więc myliłem się przyjmując, że Dependency Injection może zająć miejsce Singletonów? Naprawdę szukam lepszego sposobu, by kod miał dostęp do klasy, która powinna być tylko jedną z nich. – Mitch

+0

Nie, nie myliłeś się. Domyślnie fasola Spring jest singleton. Ziarna Guice są domyślnie prototypami, ale mogą być skonfigurowane jako single. Chciałem tylko wskazać, że głównym celem DI nie jest ułatwienie singletonom. Jego głównym celem jest ułatwienie testowania. –

1

Niedawno "złączyłem" to thread na Singleton i jak złe może być (lub nie) i co możesz zrobić, aby go ominąć. Warto przeczytać.

Powiązane problemy