Ha egy osztály belsőleg egy vagy több erőforrásra támaszkodik, és ezek az erőforrások befolyásolják az osztály működését, akkor a szingletont és a statikus segédprogram osztályokat nem szabad használni.
Az osztálynak nem szabad közvetlenül létrehoznia ezeket az erőforrásokat, ehelyett célszerű azokat a konstruktornak átadni. A függőségi injektálás révén javítható az osztály rugalmassága, újrafelhasználhatósága és tesztelhetősége.
Példa
Statikus segédprogram osztály használatának példája
Ez a segédprogram osztály feltételezi, hogy csak egy szótárat használ. A valóságban azonban a szótárak nyelv szerint vannak elkülönítve, sőt, speciális szavakhoz külön szótár is létezhet.
Szingletton osztály használatának példája
A szingletton osztály is csak egy szótár használatát feltételezi, így a fentiekben említett hátrányok itt is érvényesek.
Megoldás 1 - A final kulcsszó eltávolítása a mezőből
A statikus segédprogram osztály vagy a szingletton osztály dictionary mezőjéből eltávolítható a final kulcsszó, és lehetővé tehető, hogy kívülről másik szótárra cseréljék. Ez a módszer azonban nem túl praktikus, és több szálú környezetben szinkronizálási problémákat okozhat.
Megoldás 2 - Függőségi injektálás használata
A fenti példákból látható, hogy a statikus osztályoknak és a szingletton osztályoknak nem szabad belső erőforrásoktól függeniük. Vagyis a belső erőforrásokat kívülről kell beállítani.
A függőségi injektálást használó osztályok a final kulcsszónak köszönhetően garantálják a változatlanságot, és több erőforrás-példányt is támogatnak. A függőségi injektálás nem csak a konstruktorban, hanem statikus gyárakban és építőkben is alkalmazható.
A függőségi injektálás során nem csak az erőforrás maga adható át, hanem az erőforrás-gyár is. A gyár egy olyan objektum, amely minden híváskor egy adott típusú példányt hoz létre. Ezt a módszert gyármetódus mintának nevezik, és a Java 8-ban a Supplier<T> tökéletes példa rá.
Általában korlátozott helyettesítő karakter típusokat használnak a gyár típusparaméterének korlátozására. Ezzel a módszerrel az ügyfél bármilyen olyan típust átadhat a gyárnak, amely a megadott típus alatti altípus.
A függőségi injektálás növeli a rugalmasságot és a tesztelhetőséget, de nagyon sok függőséggel rendelkező projektekben jelentős költséggel járhat. Ilyen esetekben a függőségi injektáló keretrendszerek (Dagger, Guice, Spring stb.) használata csökkentheti a költségeket.
Hozzászólások0