![translation](https://cdn.durumis.com/common/trans.png)
Ez egy AI által fordított bejegyzés.
[Hatékony Java] 5. pont: Ne adja meg a forrásokat, hanem használjon függőségi injektálást
- Írás nyelve: Koreai
- •
-
Referencia ország: Minden ország
- •
- Informatika
Válasszon nyelvet
A durumis AI által összefoglalt szöveg
- Ha egy osztály belsőleg egy vagy több erőforrástól függ, akkor kerülje a statikus segédprogram-osztályok és a szinglettek használatát, és használat helyett függőségi injektálást alkalmazzon.
- A függőségi injektálás segítségével javítható az osztály rugalmassága, újrafelhasználhatósága és tesztelhetősége, és a forrásokat a konstruktorban, statikus gyárban, építőben stb. lehet bevinni.
- A függőségi injektálást a forrás maga vagy a forrásgyár átadásával lehet használni, és a nagyszámú függőséggel rendelkező projektekben hatékonyabb a függőségi injektálási keretrendszer használata.
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 szingletons és a statikus segédprogramok osztályait nem szabad használni.
Ezt az erőforrást nem kell az osztálynak közvetlenül létrehoznia, hanem a szükséges erőforrást a konstruktornak kell átadnia. Az attribútumok függőségének befecskendezése révén javíthatjuk az osztály rugalmasságát, újrafelhasználhatóságát és tesztelhetőségét.
Példa
Példa statikus segédprogram osztályra
public class SpellChecker {
private static final Lexicon dictionary = new Lexicon();
private SpellChecker() {
}
public static boolean isValid(String word) {
// logika a szótár használatával
}
public static List suggestions(String typo) {
// logika a szótár használatával
}
Ez a segédprogram osztály feltételezi, hogy csak egy szótár létezik. A valóságban azonban a szótárak általában nyelvenként külön vannak, sőt vannak olyan esetek is, amikor egy külön szótár van az egyedi szavakhoz.
Példa szingletons osztályra
public class SpellChecker {
private final Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static boolean isValid(String word) {
// logika a szótár használatával
}
public static List suggestions(String typo) {
// logika a szótár használatával
}
A szingletons osztály is ugyanazt a hibát követi el, mint a fenti példa, mivel csak egy szótárat feltételez.
Megoldás 1 - Töröljük a final kulcsszót a mezőből.
public class SpellChecker {
private Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static void changeDictionary(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// logika a szótár használatával
}
public static List suggestions(String typo) {
// logika a szótár használatával
}
A statikus segédprogram osztályban vagy a szingletons osztályban törölhetjük a final kulcsszót a dictionary mezőből, és lehetővé tehetjük, hogy a szótárat külsőleg egy másik szótárra cseréljük. Ez a megközelítés azonban kényelmetlen, és egyidejűségi problémákat is okozhat többszálas környezetben.
Megoldás 2 - Használjuk az attribútumok függőségének befecskendezését.
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// logika a szótár használatával
}
public static List suggestions(String typo) {
// logika a szótár használatával
}
A fenti példából láthatjuk, hogy a statikus és a szingletons osztályok nem támaszkodhatnak belső erőforrásokra. Vagyis az erőforrásokat külsőleg kell beadni.
Az attribútumok függőségének befecskendezését 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 támogatnak. Az attribútumok függőségének befecskendezése a konstruktoron kívül statikus gyárakban és építőkben is használható.
Az attribútumok függőségének befecskendezésekor nemcsak az erőforrást közvetlenül adhatjuk át, hanem gyakran használják az erőforrás-gyárak átadását is. A gyár olyan objektum, amely adott típusú példányt hoz létre minden hívásakor. Ez a megközelítés a gyármetodus-mintázat, és a Java 8-ban a Supplier
public static List create(Supplier extends Car> generator) {
...
A gyár típusparaméterét gyakran korlátozott vadkártyatípus használatával korlátozzák. Ez a megközelítés lehetővé teszi a kliensek számára, hogy a gyárba bármilyen típust behelyettesítsenek, amely a megadott típus altípusa.
Az attribútumok függőségének befecskendezése javítja a rugalmasságot és a tesztelhetőséget, de nagymértékben növeli a költségeket a nagyszámú függőséggel rendelkező projekteknél. Ilyen esetekben az attribútumok függőségének befecskendezésének keretrendszere (például Dagger, Guice, Spring) csökkenti a költségeket.