Pular para o conteúdo

Boas práticas e padrões · Padrões de criação · 4 min de leitura

Singleton (e por que usar com cuidado)

Garante uma única instância de uma classe — útil para recursos caros, mas vira estado global se usado sem critério.

Tela A → Contêiner DITela B → Contêiner DIWorker → Contêiner DIContêiner DI → AppDatabase: mesma instânciamesma instânciaTela ATela ATela BTela BWorkerWorkerContêiner DI — escopo: appContêiner DIescopo: appAppDatabase — uma instânciaAppDatabaseuma instância

Arraste para o lado para ver o diagrama inteiro.

A instância única existe, mas quem a entrega é o contêiner de DI — as classes recebem o banco pelo construtor e continuam testáveis.

Quando faz sentido

Recursos caros e compartilhados: conexão com banco (o Room recomenda uma instância por app), cliente HTTP com pool de conexões, cache em memória. Em Kotlin, object já é um singleton seguro entre threads.

Os problemas

  • Estado global escondido: qualquer classe pode alterá-lo; bugs que dependem da ordem dos testes.
  • Acoplamento invisível: a dependência não aparece no construtor.
  • Difícil de testar: não dá para trocar por um fake.

A alternativa moderna

Mantenha uma instância, mas entregue-a por injeção de dependência com escopo de aplicação (Koin single { }, Hilt @Singleton). Use object apenas para coisas sem estado (funções utilitárias, constantes).

No código: antes e depois

✗ AntesKotlin
object Sessao { var usuario: Usuario? = null } // qualquer lugar lê e escreve

class Carrinho { fun dono() = Sessao.usuario!!.nome } // dependência invisível
✓ DepoisKotlin
class SessaoRepository { private val _usuario = MutableStateFlow<Usuario?>(null); val usuario = _usuario.asStateFlow() }

class Carrinho(private val sessao: SessaoRepository) // dependência explícita

// Koin: uma instância para o app inteiro, entregue a quem pedir
val appModule = module {
  single { SessaoRepository() }
  factory { Carrinho(get()) }
}

Continua existindo uma única sessão, mas agora ela é imutável por fora, aparece no construtor e pode ser substituída em teste.

Em resumo

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →