Sobes.tech
Junior

Kuidas luua Androidis klassi ainus eksemplar?

sobes.tech AI

Vastus AI-lt

Androidis kasutatakse tavaliselt Singleton mustrit klassi ainukese eksemplari loomiseks.

On mitu Singletoni rakendamise viisi:

  1. Hilis initsialiseerimine koos sünkroniseerimisega:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // Privaatne konstruktor takistab teiste eksemplaride loomist
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Eelised: Tõrke- ja niiditurvaline.
    • Miinused: Sünkroniseerimine võib aeglustada jõudlust sagedaste väljakutsete korral.
  2. Klassi laadimise ajal initsialiseerimine (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Eelised: Niiditurvaline ilma selge sünkroniseerimiseta. Lihtsam.
    • Miinused: Eksemplar luuakse kohe klassi laadimisel, isegi kui seda ei kasutata.
  3. Kahekordne kontrollitud lukustus (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;
        }
    }
    
    • Eelised: Suurem jõudlus võrreldes lihtsa sünkroniseerimisega, initsialiseerub ainult vajadusel.
    • Miinused: Nõuab volatile õige toimimise jaoks mitme niidiga keskkonnas.
  4. Staatiline sisemine klass:

    public class Singleton {
        private Singleton() {}
    
        private static class SingletonHolder {
            public static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    • Eelised: Niiditurvaline, hiline initsialiseerimine, lihtne rakendada. Soovitatav kaasaegsetes Java versioonides.
  5. Enum kasutamine:

    public enum Singleton {
        INSTANCE;
    
        // Lisame klassi meetodid
        public void doSomething() {
            // ...
        }
    }
    
    • Eelised: Kõige lihtsam ja niiditurvaline viis, vastupidav serialiseerimisele ja refleksioonile. Sageli peetakse parimaks praktikaks.

Valik sõltub konkreetsetest jõudlus- ja keerukusnõuetest. Androidis kasutatakse sageli Enum või statilist sisemist klassi.