Klasa singleton w Javie - jak używać klasy singleton?



Ten artykuł na temat klasy pojedynczej w Javie omawia różne sposoby, w jakie klasa może zostać utworzona jako singleton, wraz z praktycznymi implementacjami.

W Javie klasa pojedyncza to klasa, która może mieć tylko jedną instancję w danym momencie. Jest to jeden z pięciu wzorców projektowania kreacji w Javie, który pomaga w łatwym tworzeniu . Za pośrednictwem tego artykułu dam ci jasny wgląd w to, czym jest klasa singleton w Javie i jak możesz ją utworzyć.

Poniżej znajdują się tematy, które omówię w tym artykule:





Zacznijmy.

Co to jest klasa singleton w Javie?

Mówiąc prościej, klasa Singleton w Javie to klasa, która umożliwia dostęp do niej za pośrednictwem pojedynczej instancji na raz. Ten wzorzec projektowy służy do ograniczenia niepotrzebnych instancji klasy i zapewnienia, że ​​tylko jedna istnieje w dowolnym momencie na instancję maszyny JVM. Dlatego w przypadku tego wzorca każda klasa zdefiniowana jako Singleton ma tylko jedną instancjęz globalnym punktem dostępu do niego. W przeciwieństwie do zwykłych klas, klasa pojedyncza nie jest niszczona pod koniec cyklu życia aplikacji.



Ale dlaczego w pierwszej kolejności potrzebujemy klasy singleton?

Cóż, ograniczając tworzenie instancji klasy, oszczędza miejsce w pamięci, ponieważ teraz obiekt nie będzie tworzony za każdym razem, gdy zostanie wysłane nowe żądanie. Zamiast tego pojedynczy obiekt będzie używany wielokrotnie. To jest powód, dla którego wzorzec Singleton w Javie jest najczęściej używany z i aplikacje bazodanowe. Zasadniczo jest używany do rejestrowania, buforowania, buforowania wątków, ustawień konfiguracji i wielu innych.

co to jest konstruktor w Pythonie

Mam nadzieję, że koncepcja klasy Singleton w Javie jest dla Ciebie jasna. A więc przejdźmy teraz dalejSingleton Class in Java i zobacz, jak są tworzone.



Sposoby projektowania klasy singleton Java

Aby utworzyć singleton klasy w Javie, potrzebujesz następujących trzech rzeczy:

  1. statyczny element członkowski klasy
  2. prywatny konstruktor
  3. statyczna metoda fabryczna

Ponieważ Java pozwala programistom odkrywać ich horyzonty, sąwiele sposobów projektowania klasy Singleton. Poniżej wymieniłem najpopularniejsze z nich.

  1. Chętna metoda inicjalizacji
  2. Leniwa metoda inicjalizacji
  3. Metoda bezpiecznego pojedynczego wątku
  4. Leniwa inicjalizacja metodą podwójnej blokady
  5. Metoda leniwego ładowania
  6. Metoda inicjalizacji bloku statycznego

Przyjrzyjmy się teraz głębiej każdemu z tych podejść, jedno po drugim.

1. Chętna metoda inicjalizacji

Jest to najłatwiejsza metoda tworzenia klasy Singleton, w której instancja jest tworzona w momencie ładowania klasy. Aby utworzyć klasę singleton za pomocą tej metody, musisz wykonać poniższe kroki:

czym jest szef kuchni w devops
  1. Zadeklaruj konstruktor jako prywatny.
  2. Następnym krokiem jest utworzenie członka klasy prywatnej dla tej klasy Singleton.
  3. Teraz musisz zdefiniować metodę fabryczną, która zostanie użyta do zwrócenia obiektu Twojej klasy, który stworzyliśmy jako instancję elementu klasy.
  4. Możesz nawet zadeklarować statyczny element członkowski jako publiczny, jeśli chcesz uzyskać bezpośredni dostęp do tego statycznego wystąpienia.

Teraz zobaczmy, jak je wdrożyć.

// Eager Initialization publiczna klasa EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

Jeśli widzisz kod, możesz zauważyć, że za każdym razem, gdy tworzymy instancję obiektu, używamy rozszerzeniauzyskac instancje()zamiast wywoływać klasę budowniczy .Ale ma swoje wady. Jeśli użyjesz tej metody do utworzenia pojedynczej klasy, wówczas instancja zostanie utworzona niezależnie od tego, czy aplikacja ją używa, czy nie.

Przejdźmy więc dalej i zobaczmy inny sposób tworzenia pojedynczej klasy w Javie.

2. Leniwa metoda inicjalizacji

Ta metoda jest nazywana leniwą inicjalizacją, ponieważ odkłada utworzenie instancji klasy do jej pierwszego użycia. Chodzi mi o to, że w tej metodzie obiekt jest tworzony tylko wtedy, gdy jest potrzebny. Pomaga uniknąć niepotrzebnego tworzenia plików . Aby zaprojektować klasę pojedynczą w ten sposób, musisz wykonać poniższe czynności:

  1. Przede wszystkim zadeklaruj konstruktor jako prywatny.
  2. Następnie musisz utworzyć prywatną instancję statyczną dla tej klasy, ale nie musisz jeszcze jej tworzyć.
  3. Na koniec utwórz metodę fabryki, która najpierw sprawdzi, czy element członkowski wystąpienia ma wartość null, czy nie. Jeśli nie, to utworzy dla Ciebie instancję klasy singleton i zwróci ją.

Poniższy kod pokazuje, jak to zrobić.

// LazySingleton klasa publiczna LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = new LazySingleton ()}} powrót INSTANCE}}

3. Bezpieczny wątek Singleton metoda

Ale powyższe podejście może budzić pewne obawy w równoległych scenariuszach. Ponieważ wzorzec singleton jest używany głównie z wieloma wątkami i jeśliwiele wątków wchodzi w warunek if w tym samym czasie może to powodować problemy. Aby tego uniknąć, próbujemy utworzyć pojedynczą klasę bezpieczną dla wątków, synchronizując globalną metodę dostępu. Zapewnia to, że tylko jeden wątek wykonuje tę metodę w dowolnym momencie. Zapoznaj się z poniższym kodem, aby zobaczyć implementację:

// ThreadSafeSingleton publiczna klasa Singleton {prywatna statyczna ThreadSafeSingleton INSTANCE prywatna ThreadSafeSingleton () {} publiczna statyczna zsynchronizowana ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

Ale czasami to podejście może stać się bardzo uciążliwe, jak za każdym razem metodajest wywoływana, musi poczekać na zwolnienie blokady, zanim metoda będzie mogła jej użyć. Powoduje to spowolnienie procesu i prowadzi nas do kolejnego podejściaLeniwa inicjalizacja z podwójną blokadą.

4. Leniwa inicjalizacja z podwójną blokadą metoda

W tym podejściu nie synchronizujemy metod. Zamiast tego otaczamy kod tworzenia obiektów w zsynchronizowanym bloku.Możesz to powiedzieć, sprawdzając wcześniej blokady wątkuzmniejsza liczbę przejęć blokad. Takie podejście zwykle prowadzi do zwiększenia wydajności aplikacji. Sprawdź poniższy kod, aby zobaczyć, jak to się robi.

jak używać sortowania w C ++
// Leniwa inicjalizacja z publiczną klasą Double Lock LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDoubleLockSingleton. if (LazyDoubleLockSingleton) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} return INSTANCE}}

5. Metoda leniwego ładowania

Ta metoda jest oparta na JSL (Java Language Specification) i zgodnie z tym załaduje statyczne składowe danych tylko wtedy, gdy są wymagane. Dlatego po załadowaniu klasy pojedynczej do maszyny JVM nie jest tworzona żadna instancja. Ponadto podczas wykonywania programu metoda globalna jest wywoływana w kolejności sekwencyjnej. Dzięki tej metodzie nie trzeba jawnie synchronizować statycznej metody getInstance () w celu załadowania i zainicjowania. Statyczny element członkowski klasy zostanie wywołany w odpowiedniej kolejności, pozostałe współbieżne wywołania metody globalnej zostaną zwrócone w tej samej kolejności bez konieczności wykonywania narzutu synchronizacji.

Poniżej znajduje się kod, aby wykonać to samo.

// Metoda Lazy Load publiczna klasa LazyLoadSingleton {private LazyLoadSingleton () {} prywatna statyczna klasa SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Metoda inicjalizacji bloku statycznego

Ta metoda tworzenia klasy pojedynczej w Javie topodobny do metody szybkiej inicjalizacji. Jedyną różnicą jest to, że instancja tej klasy jest tworzona w ramach bloku statycznego posiadającego funkcjonalność.

// Inicjalizacja bloku statycznego Klasa publiczna StaticBlockSingleton {statyczna statyczna prywatna StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // obsługa wyjątków w bloku statycznym statyczna {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Exception exception podczas tworzenia klasy singleton ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

To prowadzi nas do końca tego artykułu o klasie Singleton w Javie. Jeśli chcesz dowiedzieć się więcej o Javie, możesz skorzystać z naszego .

Teraz, gdy zrozumiałeś, czym jest klasa Singleton w Javie, zapoznaj się z autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja J2EE i SOA firmy Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistą Java. Kurs ma na celu zapewnienie przewagi w programowaniu w języku Java i przeszkolenie zarówno podstawowych, jak i zaawansowanych koncepcji języka Java, a także różnych struktur Java, takich jak Hibernate i Spring.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy w tym artykule „Singleton Class in Java”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.