제이온

[Skuteczne Java] Element 5. Nie deklaruj zasobów, użyj wstrzykiwania zależności

  • Język oryginalny: Koreański
  • Kraj: Wszystkie krajecountry-flag
  • TO

Utworzono: 2024-04-28

Utworzono: 2024-04-28 13:39

Jeśli klasa wewnętrznie zależy od co najmniej jednego zasobu, a ten zasób wpływa na działanie klasy, to lepiej nie używać singletonów ani klas narzędzi statycznych.


Klasa nie powinna tworzyć tych zasobów samodzielnie. Zamiast tego, lepiej jest przekazać niezbędne zasoby do konstruktora. Iniekcja zależności pozwala na poprawę elastyczności, ponownego użycia i ułatwienia testowania klasy.


Przykład

Przykład użycia klasy narzędzi statycznych

Ta klasa narzędzi zakłada, że używany jest tylko jeden słownik. Jednak w rzeczywistości słowniki mogą być oddzielne dla każdego języka, a nawet osobne dla specjalistycznych słownictw.


Przykład użycia klasy singleton


Klasa singleton również zakłada używanie tylko jednego słownika, więc ma ten sam problem, co poprzedni przykład.


Rozwiązanie 1 - Usunięcie słowa kluczowego final z pola


Można usunąć słowo kluczowe final z pola dictionary w klasie narzędzi statycznych lub klasie singleton i zaprojektować możliwość zmiany słownika z zewnątrz. Jednak takie rozwiązanie jest niewygodne w użyciu i może prowadzić do problemów z współbieżnością w środowiskach wielowątkowych.


Rozwiązanie 2 - Użycie iniekcji zależności


Na podstawie powyższych przykładów widać, że klasy statyczne i klasy singleton nie powinny zależeć od wewnętrznych zasobów. Oznacza to, że lepiej jest, aby zasoby były wstrzykiwane z zewnątrz.


Klasa wykorzystująca iniekcję zależności dzięki słowu kluczowemu final gwarantuje niezmienność i obsługuje wiele instancji zasobów. Ponadto iniekcję zależności można zastosować nie tylko w konstruktorze, ale także w statycznej fabryce i konstruktorze.


Iniekcja zależności może polegać na prostym przekazaniu zasobu, ale często stosuje się również przekazywanie fabryki zasobów. Fabryka to obiekt, który za każdym razem, gdy jest wywoływany, tworzy nową instancję określonego typu. Ten sposób nazywa się wzorem fabryki metod i jest idealnie zilustrowany przez interfejs Supplier<T> w Javie 8.



Zazwyczaj używa się ograniczonego dzikiego typu do ograniczenia parametru typu fabryki. Dzięki temu klient może przekazać dowolną fabrykę, która zwraca podtyp określonego typu.


Iniekcja zależności poprawia elastyczność i ułatwia testowanie, ale w projektach o bardzo dużej liczbie zależności może być kosztowna. W takich przypadkach można użyć frameworków iniekcji zależności (np. Dagger, Guice, Spring), aby zmniejszyć koszty.


Źródła

Komentarze0