Junior
Kako kreirati jedinstveni primer klase u Androidu?
sobes.tech АИ
Одговор од АИ
У Android-у се обично користи патерн Singleton за креирање једног примерка класе.
Постоји неколико начина за имплементацију Singleton:
-
Ленија инициализација са синхронизацијом:
public class Singleton { private static Singleton instance; private Singleton() { // Приватни конструктор спречава стварање других примерка } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }- Предности: Тхред-сигурно.
- Недостаци: Синхронизација може смањити перформансе при честом позиву.
-
Иницијализација при учитавању класе (Eager initialization):
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }- Предности: Тхред-сигурно без јасне синхронизације. Једноставније.
- Недостаци: Екземпляр се креира одмах при учитавању класе, чак и ако се не користи.
-
Double-checked locking:
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; } }- Предности: Повишена перформанса у поређењу са једноставном синхронизацијом, иницијализација само када је потребна.
- Недостаци: Захтева
volatileза исправан рад у мулти-тред средини (од Java 5). Компликованије.
-
Статички унутрашњи клас:
public class Singleton { private Singleton() {} private static class SingletonHolder { public static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } }- Предности: Тхред-сигурно, лениво иницијализовање, једноставно за имплементацију. Најпрепорученији приступ у савременим верзијама Јаве.
-
Користећи Enum:
public enum Singleton { INSTANCE; // Додајте методе класе public void doSomething() { // ... } }- Предности: Најједноставнији и тхред-сигурни начин, отпоран на серијализацију и рефлексију. Често се сматра најбољом праксом.
Избор имплементације зависи од конкретних захтева за перформансама и сложеношћу. У Android-у се често користе Enum или статички унутрашњи клас.