Sobes.tech
Junior

Kako kreirati jedinstveni primer klase u Androidu?

sobes.tech АИ

Одговор од АИ

У Android-у се обично користи патерн Singleton за креирање једног примерка класе.

Постоји неколико начина за имплементацију Singleton:

  1. Ленија инициализација са синхронизацијом:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // Приватни конструктор спречава стварање других примерка
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Предности: Тхред-сигурно.
    • Недостаци: Синхронизација може смањити перформансе при честом позиву.
  2. Иницијализација при учитавању класе (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Предности: Тхред-сигурно без јасне синхронизације. Једноставније.
    • Недостаци: Екземпляр се креира одмах при учитавању класе, чак и ако се не користи.
  3. 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). Компликованије.
  4. Статички унутрашњи клас:

    public class Singleton {
        private Singleton() {}
    
        private static class SingletonHolder {
            public static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    • Предности: Тхред-сигурно, лениво иницијализовање, једноставно за имплементацију. Најпрепорученији приступ у савременим верзијама Јаве.
  5. Користећи Enum:

    public enum Singleton {
        INSTANCE;
    
        // Додајте методе класе
        public void doSomething() {
            // ...
        }
    }
    
    • Предности: Најједноставнији и тхред-сигурни начин, отпоран на серијализацију и рефлексију. Често се сматра најбољом праксом.

Избор имплементације зависи од конкретних захтева за перформансама и сложеношћу. У Android-у се често користе Enum или статички унутрашњи клас.