Jak zrobić Singletona w Javie? Rodzaje inicjalizacji, porównania i punkty do zapamiętania
Opublikowany: 2020-10-07Klasa singletona w Javie jest zdefiniowana jako klasa, która ma tylko jeden obiekt, tj. tylko jedną instancję klasy. Ograniczenie instancji tylko do jednej na klasę pomaga w kodowaniu konkretnych programów, które wymagają tylko jednej instancji klasy. Jedyne wystąpienie klasy singleton ma globalny punkt dostępu.
Klasa Singleton jest jednym z ważnych wzorców projektowych w programowaniu Java. Klasy singletonów pomagają w ograniczaniu zasobów i ich optymalizacji; jest często używany w połączeniach lub gniazdach baz danych. Istnieją składnie implementacyjne dla klasy singleton i dobry programista musi o tym wiedzieć. Zobaczmy implementację klasy singleton w Javie.
Ucz się programów dla inżynierów oprogramowania online z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.
Przeczytaj: Wyjaśnienie architektury i komponentów Java
Spis treści
Inicjalizacja
Inicjalizacja singletona w Javie odbywa się za pomocą prywatnego konstruktora. Konstruktory prywatne pomagają w innych klasach, które nie są w stanie stworzyć tej samej instancji, co twoja klasa singleton. Istnieje pięć typów inicjalizacji klasy singleton w Javie, które wymieniono poniżej:
1. Chętna inicjalizacja
Zostanie utworzona metoda publiczna powszechnie nazywana jako getInstance(). Ta metoda pomoże w zapewnieniu tylko jednego punktu wejścia do tworzenia instancji klasy, dzięki czemu będzie to klasa singleton. Instancja klasy w przyspieszonej inicjalizacji jest tworzona w momencie ładowania klasy.

Ten rodzaj techniki inicjalizacji automatycznie tworzy instancję klasy, nawet jeśli użytkownik jej nie używa. Może to powodować problemy z pamięcią i niepotrzebną długość kodu. Aby przeciwdziałać problemowi wycieku pamięci, zobaczmy inny rodzaj techniki inicjalizacji dla klasy singleton w Javie.
2. Leniwa inicjalizacja
Instancja klasy jest inicjowana w samej metodzie getInstance() w inicjalizacji z opóźnieniem. Metoda w leniwej inicjalizacji sprawdzi, czy instancja klasy została utworzona czy nie, a jeśli nie, to tylko tworzy instancję, rozwiązując w ten sposób problem wycieku pamięci.
Metoda tworzona w leniwej inicjalizacji jest statyczna i ma obiekt typu zwracanego. Instancja singletona w leniwej inicjalizacji nie zostanie utworzona, dopóki metoda getInstance() nie zostanie wywołana po raz pierwszy.
3. Leniwa inicjalizacja za pomocą metody podwójnej blokady
Ta metoda jest używana w czasie więcej niż jednego wątku. Jeśli używamy dwóch wątków w programie i do obu można uzyskać dostęp za pomocą instrukcji 'if' podczas uruchamiania, gdy instancja jest pusta, spowoduje to sytuację konfliktu i możesz znaleźć błędy.
Ten problem został rozwiązany przez metodę Double Lock, w której tylko jeden wątek wchodzi na raz do zsynchronizowanego bloku w celu zainicjowania instancji, podczas gdy drugi wątek jest blokowany. Gdy pierwszy wątek wychodzi z synchronizowanego bloku, tylko drugi wątek wchodzi i tworzy kolejną instancję. Domyślnie drugi wątek nie sprawdza, czy wystąpienie jest inne niż null, czy nie.
4. Metoda leniwego ładowania
W tej metodzie tworzona jest zagnieżdżona klasa wewnętrzna, która działa na zasadach JLS (Java Language Specifications). W klasie nie byłoby składowych danych statycznych; JVM nie utworzy instancji klasy. Instancja zostałaby utworzona tylko na żądanie, gdy wywołamy metodę getInstance().
Nie musisz synchronizować metody do inicjalizacji i ładowania, ponieważ ta metoda pomaga w automatycznej synchronizacji wszystkich wywołań pobierania Instance().
5. Metoda wyliczeń
Wiele wystąpień klasy singleton może być nadal tworzonych przez serializację i odbicie w powyższych metodach. W przypadku tworzenia ścisłej klasy singleton można zastosować tę metodę. Pola Enums są używane w tej metodzie, która jest stałą i działa tylko w czasie kompilacji.

Enum to wystąpienie typu Enum i zostanie skonstruowane tylko wtedy, gdy typ Enum zostanie wywołany/wywoływany po raz pierwszy w kodzie. Ta metoda ogranicza klonowanie instancji i tworzy idealną klasę singletona.
Przeczytaj także: 12 najlepszych programów wzorcowych w Javie, które powinieneś sprawdzić dzisiaj
Serializacja i refleksja
Serializacja pomaga w transporcie obiektów Java z jednej JVM (Java Virtual Machine) do drugiej. Serializacja jest jedną z metod używanych do tworzenia wielu wystąpień klasy. Serializacja konwertuje obiekt na strumień bajtów, a następnie transfer jest wykonywany.
Strumień bajtów pomaga w odtworzeniu obiektu w innej maszynie wirtualnej JVM przy użyciu procesu deserializacji. Pomaga wielu systemom komunikować się i udostępniać obiekty między nimi. Pomaga w synchronizacji cross JVM, ponieważ obiekty będą działać w różnych maszynach JVM.
Odbicie to także metoda klonowania obiektów w Javie. Odbicie to interfejs API, który pomaga nam poznać klasę dowolnego nieznanego obiektu i metod tej konkretnej klasy, do których można uzyskać dostęp za pośrednictwem obiektu. Odbicie jest powszechnie używane przez programistów do modyfikowania zachowania klas i metod w czasie wykonywania.
Trzy główne polecenia używane w refleksji to getClass() w celu poznania klasy, do której należy obiekt, getConstructors() w celu uzyskania publicznych konstruktorów klasy obiektu, getMethods() w celu poznania publicznych metod obserwowanej klasy.
Klasa normalna Vs klasa Singleton
Standardowa klasa w Javie używa konstruktorów do inicjalizacji samej siebie, podczas gdy my używamy metody getInstance() do inicjalizacji klasy singleton. Możemy również użyć tej samej nazwy klasy i metody. Najpierw tworzymy obiekt dla normalnych klas, a następnie używamy jego metod i właściwości.
W przeciwieństwie do tego, w klasie singleton tworzymy instancję za pomocą właściwości statycznej klasy iw dowolnym momencie kodu ta konkretna klasa zwróci tylko jedną instancję.
Oprócz wielu zalet klas singleton, istnieją również pewne luki, takie jak metody testowania jednostek manipulacji w klasach singleton, jeśli obiekty i metody są ściśle powiązane. W takim przypadku będziesz musiał zadedykować w pełni funkcjonalną klasę singletonowi.
Ukryte zależności są również czasami tworzone przez klasę singleton, ponieważ odwołanie do klasy singleton jest przekazywane do innych metod i nie jest w pełni przejrzyste, co utrudnia programistom/programistom śledzenie metod i klas. Należy pamiętać o tych niedociągnięciach przed tworzeniem wzorca singletona i starać się go zminimalizować.
Punkty, aby stworzyć idealną klasę singletona
1. Punkty, na których należy się skupić, aby stworzyć idealną klasę singletona, są następujące:
2. Jeśli tworzysz wiele wątków w klasie singleton, upewnij się, że wszystkie wątki nie powinny inicjować klasy singleton w tym samym czasie. Należy spróbować stworzyć bezpieczne wątkowo klasy singleton.

3. Udowodnij odbicie klasy singletona, zmieniając widoczność konstruktora publicznie w czasie wykonywania i upewniając się, że istnieje tylko jedna instancja określonej klasy singletona.
4. Jeśli istnieje wiele wątków, można użyć modyfikatora volatile, który uniemożliwia wątkowi przeglądanie stanu zainicjowanego innych wątków. Modyfikator volatile działa w relacji stanie się przed, w której zapis ma miejsce w wątku, zanim jakikolwiek inny wątek będzie mógł go odczytać.
Trzeba przeczytać: ciekawe pomysły na projekty Java dla początkujących
Wniosek
Klasy Singleton są używane do tworzenia niestandardowych połączeń z bazą danych lub dowolnym programem, w którym chcesz kontrolować metody i instancje klasy.
Jeśli chcesz poprawić swoje umiejętności w języku Java, musisz zdobyć te projekty Java. Jeśli chcesz dowiedzieć się więcej o Javie, tworzeniu pełnego stosu, zapoznaj się z programem Executive PG UpGrad i IIIT-B w tworzeniu oprogramowania - specjalizacja w tworzeniu pełnego stosu , który jest przeznaczony dla pracujących profesjonalistów i oferuje ponad 500 godzin rygorystycznych szkoleń, 9 + projekty i zadania, status absolwentów IIIT-B, praktyczne praktyczne projekty zwieńczenia i pomoc w pracy z najlepszymi firmami.