Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

To jest post przetłumaczony przez AI.

제이온

[Efektywny Java] Element 3. Gwarantuj singleton za pomocą prywatnego konstruktora lub typu wyliczeniowego

  • Język pisania: Koreański
  • Kraj referencyjny: Wszystkie kraje country-flag

Wybierz język

  • Polski
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Nederlands
  • हिन्दी
  • Magyar

Tekst podsumowany przez sztuczną inteligencję durumis

  • Singleton to klasa, która może utworzyć tylko jedną instancję, używaną do tworzenia obiektów bezstanowych lub unikalnych komponentów systemu.
  • Istnieją trzy sposoby tworzenia singletonów: użycie publicznych statycznych członków jako pól finalnych, dostarczanie statycznych metod fabrycznych lub użycie typów wyliczeniowych, z których najbardziej pożądanym jest użycie typów wyliczeniowych.
  • Podczas serializacji klasy singleton należy zaimplementować Serializable, zadeklarować wszystkie pola instancji jako transient i nadpisać metodę readResolve().

Singleton

Koncepcja Singletona

Singleton to klasa, która może utworzyć tylko jeden egzemplarz. Typowe przykłady singletonów to obiekty bezstanowe lub unikalne komponenty systemowe. Jednak klasy singletonowe są trudne do przetestowania, jeśli nie są zdefiniowane jako typ z interfejsem i jego implementacją.


Jak stworzyć singleton

Publiczny statyczny członek jako pole finalne


public class Elvis {

    public static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public void speak() {
        System.out.println("elvis");
    }


Prywatny konstruktor jest wywoływany tylko raz podczas inicjalizacji instancji Elvis, gwarantując, że jest to jedyny egzemplarz w całym systemie. Jednak metoda AccessibleObject.setAccessible() pozwala na wywołanie prywatnego konstruktora, a ta metoda modyfikacji za pomocą refleksji może być zablokowana poprzez wyrzucenie wyjątku podczas tworzenia drugiego obiektu.


  • Zalety
    • API wyraźnie pokazuje, że klasa jest singletonem.
    • Jest zwięzły.


Statyczna metoda fabryczna jako publiczny statyczny człon

public class Elvis {

    private static final Elvis INSTANCE = new Elvis();

    private Elvis() {
    }

    public static Elvis getInstance() {
        return INSTANCE;
    }

    public void speak() {
        System.out.println("elvis");
    }


Oprócz modyfikacji za pomocą refleksji, ta metoda również gwarantuje, że jest to jedyny egzemplarz w całym systemie. Po prostu pole jest prywatne, a zwracanie obiektu odbywa się za pomocą statycznej metody fabrycznej.


  • Zalety
    • Możliwość zmiany na nie-singleton bez zmiany API.
      • Na przykład, statyczna metoda fabryczna może zwracać różne instancje dla każdego wątku.
    • Możliwość przekształcenia w generyczną fabrykę singletonów.
    • Możliwość użycia odwołania do metody statycznej fabrycznej jako dostawcy.
      • Na przykład, zamiast Elvis::getInstance można użyć Supplier<Elvis>.


Jeśli nie potrzebujesz korzystać z powyższych zalet, lepiej jest użyć pierwszej metody.


Używanie typu wyliczeniowego

public enum Elvis {

    INSTANCE;

    public void speak() {
        System.out.println("elvis");
    }


Najlepszą metodą jest użycie typu wyliczeniowego. Jest bezpieczniejszy przed atakami refleksyjnymi niż dwie poprzednie metody i ma czystszy kod. Ponadto, jak wspomniano poniżej, dwie poprzednie metody mają wadę, że wymagają dodatkowego kodu podczas serializacji.

Należy jednak pamiętać, że tworzony singleton może dziedziczyć z interfejsu, ale nie z klasy.


Punkty do zapamiętania podczas serializacji klasy singleton

Aby zserializować klasę singleton utworzoną przy użyciu pierwszej lub drugiej metody, poza prostym zaimplementowaniem interfejsu Serializable, należy zadeklarować wszystkie pola instancji jako transient i przesłonić metodę readResolve().


private Object readResolve throws ObjectStreamException {
    return INSTANCE;


Źródła

제이온
제이온
제이온
제이온
[Efektywny Java] Element 5. Użyj wstrzykiwania zależności zamiast jawnego zarządzania zasobami Jeśli klasa zależy od zewnętrznych zasobów, lepiej nie używać singletonów ani statycznych klas narzędzi. Wstrzykiwanie zależności może poprawić elastyczność, ponowne użycie i łatwość testowania klasy, a wzorzec fabryki metod może prowadzić do bardziej wyd

28 kwietnia 2024

[Efektywny Java] Element 4. Aby zapobiec tworzeniu instancji, użyj prywatnego konstruktora Klasy pomocnicze, które zawierają tylko metody statyczne i pola, powinny mieć ustawiony modyfikator dostępu konstruktora na prywatny, aby zapobiec tworzeniu instancji. Dzięki temu można zapobiec błędnemu postrzeganiu konstruktora jako automatycznie genero

28 kwietnia 2024

[Java] Koncepcja refleksji i sposób użycia Refleksja to API, które udostępnia dostęp do informacji o klasach w trakcie wykonywania programu Java, umożliwiając manipulowanie klasami. W czasie wykonywania można tworzyć klasy, uzyskiwać dostęp do pól i metod, ale należy zachować ostrożność, ponieważ

25 kwietnia 2024

Mockowanie klienta Prisma w NestJS dla testów jednostkowych Usunięcie zależności zewnętrznych jest ważne podczas testowania jednostkowego aplikacji. Możesz łatwo przeprowadzić testy jednostkowe za pomocą metody mockowania Jest dla Prisma ORM. Po zainstalowaniu pakietu jest-mock-extended możesz zmockować klienta Pr
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2 kwietnia 2024

Modelowanie danych koncepcyjnych Modelowanie danych koncepcyjnych to proces oddzielania jednostek i przedstawiania relacji między nimi w postaci diagramu ERD. Jednostki to niezależne jednostki informacji, a atrybuty to dane posiadane przez jednostki. Identyfikator jednoznacznie identyfik
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 kwietnia 2024

[Javascript] Struktura obiektu (V8) Obiekt JavaScript w silniku V8 jest optymalizowany jak struktura w zależności od stanu, przełączając się między szybkim trybem i trybem słownika, który działa jako mapa skrótów. Szybki tryb jest szybki, gdy klucz i wartość są prawie stałe, ale może spowol
곽경직
곽경직
곽경직
곽경직
곽경직

18 marca 2024

Jak Rust zapobiega błędom współbieżności Rust to potężny język, który rozwiązuje wyzwania związane z programowaniem współbieżnym. Jego system typów i model własności zapewniają bezpieczeństwo podczas przekazywania i udostępniania danych między wątkami. Wzory zmienności wewnętrznej, takie jak Mut
곽경직
곽경직
곽경직
곽경직
곽경직

28 marca 2024

[Współbieżność] Operacja atomowa: Płot pamięci i porządkowanie pamięci Ten wpis na blogu wyjaśnia, jak wziąć pod uwagę kolejność pamięci w operacjach atomowych oraz znaczenie opcji porządkowania. Zawiera szczegółowe wyjaśnienie różnych opcji porządkowania, takich jak Relaxed, Acquire, Release, AcqRel, SecCst, wraz z omówieni
곽경직
곽경직
곽경직
곽경직
곽경직

12 kwietnia 2024

[Bez stopnia, przetrwać jako programista] 14. Podsumowanie często zadawanych pytań na rozmowach kwalifikacyjnych dla początkujących programistów Przewodnik po przygotowaniu do rozmów kwalifikacyjnych dla programistów. Wyjaśnia takie pojęcia często pojawiające się podczas rozmów jak: obszary pamięci głównej, struktury danych, RDBMS i NoSQL, programowanie proceduralne i obiektowe, nadpisywanie i prz
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 kwietnia 2024