Sobes.tech
Junior

Kaip sukurti vieną klasės egzempliorių Android?

sobes.tech AI

Atsakymas iš AI

Android dažniausiai naudojamas Singleton šablonas, norint sukurti vieną klasės egzempliorių.

Yra keletas Singleton įgyvendinimo būdų:

  1. Lazy inicializacija su sinchronizacija:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // Privatūs konstruktorius neleidžia kurti kitų egzempliorių
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Privalumai: Srauto saugumas.
    • Trūkumai: Sinchronizacija gali sumažinti našumą dažnų kvietimų metu.
  2. Klasės įkėlimo metu inicializacija (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Privalumai: Srauto saugumas be aiškios sinchronizacijos. Paprasta.
    • Trūkumai: Egzempliorius sukuriamas iš karto įkeliant klasę, net jei jis nenaudojamas.
  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;
        }
    }
    
    • Privalumai: Padidintas našumas lyginant su paprasta sinchronizacija, inicializacija tik kai reikia.
    • Trūkumai: Reikalauja volatile teisingam veikimui daugiagijiniame kontekste.
  4. Statinė vidinė klasė:

    public class Singleton {
        private Singleton() {}
    
        private static class SingletonHolder {
            public static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    • Privalumai: Srauto saugumas, vėlyva inicializacija, paprasta įgyvendinti. Rekomenduojamas šiuolaikinėse Java versijose.
  5. Enum naudojimas:

    public enum Singleton {
        INSTANCE;
    
        // Klasės metodai
        public void doSomething() {
            // ...
        }
    }
    
    • Privalumai: Labiausiai paprastas ir srauto saugus būdas, atsparus serializacijai ir refleksijai. Dažnai laikomas geriausia praktika.

Pasirinkimas priklauso nuo konkrečių našumo ir sudėtingumo reikalavimų. Android dažnai naudojami Enum arba statinė vidinė klasė.