Sobes.tech
Junior

Jak vytvořit jedinou instanci třídy v Androidu?

sobes.tech AI

Odpověď od AI

V Androidu se obvykle používá vzor Singleton k vytvoření jediného instance třídy.

Existuje několik způsobů implementace Singleton:

  1. Líné inicializace se synchronizací:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // Soukromý konstruktor zabraňuje vytváření dalších instancí
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Výhody: Vlákna-bezpečné.
    • Nevýhody: Synchronizace může snižovat výkon při častém volání.
  2. Inicializace při načtení třídy (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Výhody: Vlákna-bezpečné bez explicitní synchronizace. Jednodušší.
    • Nevýhody: Instance je vytvořena ihned při načtení třídy, i když není použita.
  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 ve srovnání s jednoduchou synchronizací, inicializace pouze při potřeby.
    • Nevýhody: Vyžaduje volatile pro správnou funkci ve vícevláknovém prostředí (od Java 5). Složitější.
  4. Statická vnitřní třída:

    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ákna-bezpečné, líná inicializace, jednoduchá implementace. Nejvíce doporučovaný přístup v moderních verzích Javy.
  5. Použití Enum:

    public enum Singleton {
        INSTANCE;
    
        // Přidejte metody třídy
        public void doSomething() {
            // ...
        }
    }
    
    • Výhody: Nejjednodušší a vlákna-bezpečný způsob, odolný vůči serializaci a reflexi. Často považován za nejlepší praxi.

Volba implementace závisí na konkrétních požadavcích na výkon a složitost. V Androidu se často používají Enum nebo statická vnitřní třída.