![translation](https://cdn.durumis.com/common/trans.png)
To jest post przetłumaczony przez AI.
Wybierz język
Tekst podsumowany przez sztuczną inteligencję durumis
- Jeśli klasa wewnętrznie zależy od jednego lub więcej zasobów, lepiej nie używać statycznych klas narzędzi ani klas singletonów, a używać wstrzykiwania zależności.
- Użycie wstrzykiwania zależności może poprawić elastyczność, ponowne użycie i łatwość testowania klasy, a zasoby można wstrzykiwać w konstruktorze, statycznej fabryce, builderze itp.
- Wstrzykiwanie zależności można zastosować, przekazując sam zasób lub fabrykę zasobów, a w projektach o wielu zależnościach użycie frameworka wstrzykiwania zależności jest efektywne.
Jeśli klasa wewnętrznie zależy od jednego lub więcej zasobów, a te zasoby wpływają na działanie klasy, najlepiej nie używać singletonów i statycznych klas pomocniczych.
Klasa nie powinna tworzyć tych zasobów samodzielnie, a zamiast tego powinna przekazywać potrzebne zasoby do konstruktora. Wstrzykiwanie obiektów zależnych pozwala na poprawę elastyczności, ponownego wykorzystania i testowalności klasy.
Przykład
Przykład użycia statycznej klasy pomocniczej
public class SpellChecker {
private static final Lexicon dictionary = new Lexicon();
private SpellChecker() {
}
public static boolean isValid(String word) {
// logika wykorzystująca słownik
}
public static List suggestions(String typo) {
// logika wykorzystująca słownik
}
Ta klasa pomocnicza zakłada, że używany jest tylko jeden słownik. W rzeczywistości jednak słowniki są oddzielne dla każdego języka, a nawet specjalistyczne słowniki są przechowywane oddzielnie.
Przykład użycia klasy singleton
public class SpellChecker {
private final Lexicon dictionary = new Lexicon();
public static SpellChecker INSTANCE = new SpellChecker();
private SpellChecker() {
}
public static boolean isValid(String word) {
// logika wykorzystująca słownik
}
public static List suggestions(String typo) {
// logika wykorzystująca słownik
}
Klasa singleton również zakłada, że używany jest tylko jeden słownik, co powoduje te same problemy, co w poprzednim przypadku.
Rozwiązanie 1 - Usuń słowo kluczowe final z pola.
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 wykorzystująca słownik
}
public static List suggestions(String typo) {
// logika wykorzystująca słownik
}
Możliwe jest również usunięcie słowa kluczowego final ze słownika w statycznej klasie pomocniczej lub klasie singleton i zmodyfikowanie projektu tak, aby zewnętrzny kod mógł zastąpić słownik innym. Jednak ten sposób jest niewygodny w użyciu i może prowadzić do problemów z jednoczesnością w środowiskach wielowątkowych.
Rozwiązanie 2 - Użyj wstrzykiwania zależności.
public class SpellChecker {
private final Lexicon dictionary;
public SpellChecker(Lexicon dictionary) {
this.dictionary = dictionary;
}
public static boolean isValid(String word) {
// logika wykorzystująca słownik
}
public static List suggestions(String typo) {
// logika wykorzystująca słownik
}
Na podstawie tego przykładu możemy zauważyć, że statyczne klasy i klasy singleton nie powinny być zależne od zasobów wewnętrznych. Oznacza to, że zasoby powinny być wstrzykiwane z zewnątrz.
Klasa wykorzystująca wstrzykiwanie zależności gwarantuje niezmienność dzięki słowu kluczowemu final i oferuje korzyści związane z obsługą wielu instancji zasobów. Wstrzykiwanie zależności można zastosować nie tylko w konstruktorze, ale także w statycznych fabrykach i konstruktorach.
Wstrzykiwanie zależności może obejmować proste przekazanie samego zasobu, ale często stosuje się również przekazanie fabryki zasobów. Fabryka to obiekt, który przy każdym wywołaniu tworzy nową instancję określonego typu. Ten schemat nazywany jest wzorcem fabryki metod i jest doskonałym przykładem implementacji fabryki w Javie 8 przez Supplier
public static List create(Supplier extends Car> generator) {
...
W przypadku fabryk zazwyczaj stosuje się ograniczony typ dzikiej karty do ograniczenia parametrów typu fabryki. Dzięki temu klienci mogą przekazać do fabryki dowolny podtyp typu określonego przez nich.
Wstrzykiwanie zależności zwiększa elastyczność i testowalność, ale w projektach o dużej liczbie zależności może być kosztowne. W takich przypadkach można użyć frameworka wstrzykiwania zależności (np. Dagger, Guice, Spring), aby zmniejszyć koszty.