Sobes.tech
Junior

Como criar uma única instância de uma classe no Android?

sobes.tech IA

Resposta da IA

Para criar uma única instância de uma classe no Android, geralmente usa-se o padrão Singleton.

Existem várias formas de implementar o Singleton:

  1. Inicialização preguiçosa com sincronização:

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // O construtor privado impede a criação de outras instâncias
        }
    
        public static synchronized Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    • Vantagens: Seguro para threads.
    • Desvantagens: A sincronização pode reduzir o desempenho em chamadas frequentes.
  2. Inicialização na carga da classe (Eager initialization):

    public class Singleton {
        private static final Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
    
    • Vantagens: Seguro para threads sem sincronização explícita. Mais simples.
    • Desvantagens: A instância é criada na carga da classe, mesmo que não seja usada.
  3. Bloqueio com verificação dupla:

    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;
        }
    }
    
    • Vantagens: Melhor desempenho que sincronização simples, inicialização apenas quando necessário.
    • Desvantagens: Requer volatile para funcionamento correto em ambientes multithread (a partir do Java 5). Mais complexo.
  4. Classe interna estática:

    public class Singleton {
        private Singleton() {}
    
        private static class SingletonHolder {
            public static final Singleton INSTANCE = new Singleton();
        }
    
        public static Singleton getInstance() {
            return SingletonHolder.INSTANCE;
        }
    }
    
    • Vantagens: Seguro para threads, inicialização preguiçosa, fácil de implementar. A abordagem mais recomendada em versões modernas do Java.
  5. Uso de Enums:

    public enum Singleton {
        INSTANCE;
    
        // Adicione métodos à classe
        public void doSomething() {
            // ...
        }
    }
    
    • Vantagens: A forma mais simples e segura para threads, resistente à serialização e reflexão. Frequentemente considerada uma melhor prática.

A escolha da implementação depende dos requisitos específicos de desempenho e complexidade. No Android, frequentemente são usados Enum ou classe interna estática.