Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Problemas do Singleton

Olá,

O instrutor do curso de Design Patterns Java II cita o problema do uso de singletos. Eu, particularmente, utilizo bastante esse padrão e não tive muitos problemas até hoje. Gostaria de saber mais sobre os perigos do uso do Singleton e quais as melhores formas de resolve-los. Se alguém tiver algum caso em que o seu uso tenha causado problemas, gostaria de entendê-lo e saber como foi solucionado.

Utilizo hoje, em alguns casos, para fornecer parâmetros de configuração de um sistema às classes que precisem. Essa instância está acessível a todas as partes do sistema e não há necessidade de instanciá-la a todo momento, até porque, ela carrega dados de um arquivo de propriedades (".properties") e efetuar o carregamento de todos os dados sempre que precisar de um parâmetro é meio complicado. Nesse caso, por exemplo, há problemas no uso de singleton?

Obrigado.

2 respostas
solução!

Olá, Alex!

Muitos desenvolvedores consideram o singleton como um "anti-pattern". O problema dele é ser um método estático, e por isso mesmo altamente acoplado. Isso dificulta a criação de mocks em testes de unidade. Por exemplo: como você faz um teste de unidade de um método que obtém um valor externo através de um singleton? Primeiramente, você não vai conseguir testar o método isoladamente (porque vai acabar testando também o singleton que está em outro lugar) e em segundo lugar existe a dificuldade de usar um framework que consiga "mockar" esse singleton. E também não é possível abstrair um singleton para uma interface. E também dificulta trabalhar com paralelismo. Por isso é considerado um "anti-pattern". O importante é usar bom senso, isto é, não usar esse pattern (ou qualquer outro pattern) indiscriminadamente, mas sim com um bom motivo (você quer limitar o "instanciamento" de uma classe).

A opção que alguns propõem seria simplesmente não usar singleton pattern, mas em vez disso um cache com algum container de injeção de dependência (ou inversão de controle - IoC). Quando você precisar da instância de uma classe, o serviço de IoC vai lhe fornecer sempre a mesma instância, e com a vantagem de você poder "mockar" esse serviço em seus testes de unidade.

Boa sorte e bons estudos!

Bacana, Marcelo. Já tinha ouvido falar desse problema relacionado a testes mas, como ainda não tenho muita experiência com TDD, não passei por isso. Acredito que com o tempo os perigos disso ficam mais claros, mas deu pra compreender.

Obrigado pela ajuda.