Sobes.tech
Junior

Ako vytvoriť jediný inštanciu triedy v Android?

sobes.tech AI

Odpoveď od AI

V Androidu sa zvyčajne používa vzor Singleton na vytvorenie jediného inštancie triedy.

Existuje niekoľko spôsobov implementácie Singleton:

  1. Lazná inicializácia so synchronizáciou:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // Privátny konštruktor zabraňuje vytvoreniu ďalších inštancií
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Výhody: Vlákno-bezpečné.
    • Nevýhody: Synchronizácia môže znižovať výkon pri častom volaní.
  2. Inicializácia pri načítaní triedy (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Výhody: Vlákno-bezpečné bez explicitnej synchronizácie. Jednoduchšie.
    • Nevýhody: Inštancia je vytvorená ihneď pri načítaní triedy, aj keď sa nepoužíva.
  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;
        }
    }
    
    • Výhody: Zvýšený výkon v porovnaní s jednoduchou synchronizáciou, inicializácia iba pri potrebe.
    • Nevýhody: Vyžaduje volatile pre správnu funkciu v viacvláknovom prostredí (od Java 5). Zložitejšie.
  4. Statická vnútorná trieda:

    public class Singleton {
        private Singleton() {}
    
        private static class SingletonHolder {
            public static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    • Výhody: Vlákno-bezpečné, lenivá inicializácia, jednoduchá implementácia. Najodporúčanejší prístup v moderných verziách Javy.
  5. Použitie Enum:

    public enum Singleton {
        INSTANCE;
    
        // Pridajte metódy triedy
        public void doSomething() {
            // ...
        }
    }
    
    • Výhody: Najjednoduchší a vlákno-bezpečný spôsob, odolný voči serializácii a reflexii. Často považovaný za najlepšiu prax.

Voľba implementácie závisí od konkrétnych požiadaviek na výkon a zložitosť. V Androide sa často používajú Enum alebo statická vnútorná trieda.