Sobes.tech
Junior

Hogyan hozzunk létre egyetlen példányt egy osztályból Androidban?

sobes.tech MI

Válasz az MI-től

Az Androidban általában a Singleton mintát használják az osztály egyetlen példányának létrehozásához.

Számos Singleton megvalósítás létezik:

  1. Lusta inicializálás szinkronizációval:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // Privát konstruktor megakadályozza más példányok létrehozását
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Előnyök: Szálbiztos.
    • Hátrányok: A szinkronizáció csökkentheti a teljesítményt gyakori hívás esetén.
  2. Osztály betöltésekor történő inicializálás (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Előnyök: Szálbiztos szinkronizáció nélkül. Egyszerűbb.
    • Hátrányok: A példány az osztály betöltésekor jön létre, még akkor is, ha nem használják.
  3. Kétszeri ellenőrzéses zárolás (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;
        }
    }
    
    • Előnyök: Növelt teljesítmény a egyszerű szinkronizációhoz képest, csak szükség esetén inicializál.
    • Hátrányok: A volatile szükséges a helyes működéshez több szálas környezetben (Java 5-től kezdve). Bonyolultabb.
  4. Statikus belső osztály:

    public class Singleton {
        private Singleton() {}
    
        private static class SingletonHolder {
            public static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    • Előnyök: Szálbiztos, lusta inicializálás, egyszerű megvalósítás. A modern Java verziókban ez a legajánlottabb módszer.
  5. Enum használata:

    public enum Singleton {
        INSTANCE;
    
        // Osztálymetódusok hozzáadása
        public void doSomething() {
            // ...
        }
    }
    
    • Előnyök: A legegyszerűbb és szálbiztos módszer, ellenáll a szériázásnak és a reflexióknak. Gyakran a legjobb gyakorlatnak tartják.

A megvalósítás kiválasztása a teljesítmény- és komplexitási követelményektől függ. Az Androidban gyakran enum vagy statikus belső osztályt használnak.