Podczas projektowania klasy usług powinien być singleton w java? Zasadniczo DAO jest tworzone jako singleton, więc czy klasa usług wywołujących powinna być również pojedyncza?Czy klasa usług powinna być pojedyncza w java?
Odpowiedz
Singletony są złe, jeśli je rozwijasz. Jeśli korzystasz z wtyczki zależności, pozwól, aby kontener DI obsługiwał pojedynczą naturę obiektu usługi. Jeśli nie używasz wtrysku zależności, użyj metody statycznej zamiast pojedynczej.
klasycznym przykładem źle:
public class HootUtility // singleton because developer was a goofball.
{
...
public void blammy(...) { ... }
public HootUtility getInstance() { ... }
}
... somewhere in the code.
HootUtility.getInstance().blammy(...); // This is silly.
Lepsza realizacja powyższego:
public class HootUtility // Not a singleton because I am not a ______. (fill in the blank as you see fit)
{
// You can limit instantiation but never prevent instantiation.
// google "java reflection" for details.
private HootUtility()
{
throw new UnsuppotedOperationException();
}
public static void blammy(...) { ... }
}
... somewhere in the code.
HootUtility.blammy(...);
Jeśli masz interfejs usługi, który ma konkretną implementację, użyj ramy wtrysku zależność wstrzyknąć realizację (Ramy DI obejmują: wiosnę i guice).
Edycja: Gdybym używał sprężyny, wybrałabym zakres singletonu (domyślny).
IMHO tak, usługi nie powinny mieć statusu i dlatego należy je składać pojedynczo.
Teraz, jeśli zrobisz to pojedynczo, uderzamy w wydajność w przypadku, gdy aplikacja wymaga intensywnej obsługi, np. Istnieje duża liczba trafień dla klasy usług – Jyotirup
@Jyotirup Właściwe użycie singletonu nie wpłynie na wydajność (jeśli cokolwiek, to poprawi to) –
@Peter Tworzenie singletonu spowoduje, że wystąpi tylko jedna instancja tej klasy obsługująca wszystkie moje żądania. Tak więc teraz, jeśli mam 10 żądań dla klasy usług, będzie obsługiwać żądania sekwencyjnie, więc będzie opóźnienie w działaniu ... wydajność osiągnie, jeśli zwiększę liczbę żądań – Jyotirup
nr
Właściwie uważam, że nie powinien dbać o nią podczas projektowania. Podobnie jak w przypadku architektury @DwB, należy wykonać to zadanie. Ponadto uważam, że nie ma zakresu ("prototyp") powinien być domyślny i nie widzę niczego złego, jeśli ktoś sam go utworzy. Również ten problem można uprościć przez modularyzację i oddzielenie interfejsu usługi od implementacji, zgodnie z zalecanymi najlepszymi praktykami.
to nowy obiekt klasy usług na każde zgłoszenie złe podejście? – Jyotirup
@Jyotirup Nie sądzę. Jeśli są wolne od stanu, możesz zmienić i używasz DI poprawnie, możesz go łatwo zmienić w dowolnym momencie. –
Powiedziałbym, że byłoby to złe podejście do prototypu. Zastanów się, czy wykonujesz tysiące żądań w swojej aplikacji internetowej, a nawet setkach. To są setki instancji inicjowanej klasy. Koncepcyjnie, jeśli stworzenie klasy i jej zależności (np. Prototypy dao z połączeniami db) jest wystarczająco kosztowne, usługi prototypowania mogą prowadzić do szybszego niszczenia, szczególnie w przypadku DDoS. Usługi świadczone pojedynczo z ramami typu DI, takie jak Spring @Autowired, zmniejszyłyby niepotrzebny przydział zasobów – user3466773
- 1. Czy pojedyncza Java powinna używać zmiennych statycznych?
- 2. Czy moja klasa sesji powinna być statyczna?
- 3. Klasa zamówienia powinna być klasą abstrakcyjną
- 4. Rozszerzanie pojedyncza klasa
- 5. Dlaczego we wzorcu ViewHolder klasa ViewHolder powinna być statyczna?
- 6. Czy funkcja `constexpr` również powinna być` noexcept`?
- 7. Czy cała logika biznesowa powinna być w modelach domenowych czy?
- 8. Czy klasy warstwy usług powinny być pojedynczymi?
- 9. Czy niestandardowa metoda wyszukiwania w modelu Laravel powinna być statyczna?
- 10. Czy globalna instalacja npm powinna być w AppData \ Roaming?
- 11. Czy wartość odwzorowania powinna być zadeklarowana w stałej lub wyliczeniowej?
- 12. czy właściwość obliczana powinna być zadeklarowana w modelu lub kontrolerze?
- 13. makieta rspec powinna być w niestandardowych dopasowaniach
- 14. Czy w Java jest klasa okręgu, jak klasa Rectangle
- 15. SQL Alchemia ResultProxy.rowcount nie powinna być zerem
- 16. Android Threading: Ta klasa programu Handler powinna być statyczna lub mogą wystąpić przecieki
- 17. Podaj wskazówkę do technologii IntelliSense, której częściowa klasa nie powinna być modyfikowana.
- 18. Czy istnieje reguła Checkstyle/PMD "Klasa nie abstrakcyjna nie powinna mieć nazwy AbstractXXX"?
- 19. Czy klasa abstrakcyjna ma serialVersionUID
- 20. Czy istnieje klasa IndexSet i klasa Range dla Java?
- 21. Czy klasa narzędziowa może być klasą modelu w strukturze MVC?
- 22. Czy klasa powinna się sprawdzać samodzielnie, czy utworzyć inną klasę, aby ją zweryfikować?
- 23. Jak ozdobić inną metodę http zdaniem opartym pojedyncza klasa A
- 24. Java: czy klasa Object ma konstruktor?
- 25. dplyr: "Błąd w n(): funkcja nie powinna być wywoływana bezpośrednio"
- 26. Sonar Metody nie powinna być pusta w konstruktorze
- 27. Jak sprawdzić, czy klasa Java jest abstrakcyjna?
- 28. Klasa DataSet w języku Java?
- 29. getResultSet() „powinna być wywoływana tylko raz w wyniku”
- 30. Klasa importu Java System
Interesujące podejście do zgłaszania wyjątku w konstruktorze. Osobiście zostawiłem to puste. Czy robisz to w swoim kodzie produkcyjnym? –
Jeśli używam Spring DI, czy zakres powinien być "Singleton" czy "Prototype"? – Jyotirup
Ogólnie, zgadzam się z tobą. Niemniej jednak opcja nr 1 jest rozsądnym rozwiązaniem, jeśli obiekt (singleton) musi utrzymywać stan wewnętrzny. – home