Junior
Jak utworzyć pojedynczy egzemplarz klasy w Androidzie?
sobes.tech AI
Odpowiedź od AI
Aby utworzyć pojedynczy egzemplarz klasy w Androidzie, zazwyczaj używa się wzorca Singleton.
Istnieje kilka sposobów implementacji Singleton:
-
Leniwa inicjalizacja z synchronizacją:
public class Singleton { private static Singleton instance; private Singleton() { // Prywatny konstruktor zapobiega tworzeniu innych egzemplarzy } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }- Zalety: Bezpieczny dla wątków.
- Wady: Synchronizacja może obniżać wydajność przy częstych wywołaniach.
-
Inicjalizacja podczas ładowania klasy (Eager initialization):
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }- Zalety: Bezpieczny dla wątków bez jawnej synchronizacji. Prostszy.
- Wady: Egzemplarz jest tworzony od razu podczas ładowania klasy, nawet jeśli nie jest używany.
-
Podwójne sprawdzanie blokady:
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }- Zalety: Lepsza wydajność w porównaniu do prostej synchronizacji, inicjalizacja tylko w razie potrzeby.
- Wady: Wymaga
volatiledla poprawnego działania w środowisku wielowątkowym (od Java 5). Bardziej skomplikowane.
-
Klasa wewnętrzna statyczna:
public class Singleton { private Singleton() {} private static class SingletonHolder { public static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }- Zalety: Bezpieczny dla wątków, leniwa inicjalizacja, prosty w implementacji. Najbardziej zalecane podejście w nowoczesnych wersjach Javy.
-
Użycie Enum:
public enum Singleton { INSTANCE; // Dodaj metody klasy public void doSomething() { // ... } }- Zalety: Najprostszy i najbardziej bezpieczny sposób, odporny na serializację i refleksję. Często uważany za najlepszą praktykę.
Wybór implementacji zależy od konkretnych wymagań dotyczących wydajności i złożoności. W Androidzie często używa się Enum lub klasy wewnętrznej statycznej.