Então… ainda não consegui ver “aquela vantagem” em criar um singleton ao invés de usar metodos estáticos, o que na minha opinião seria muito mais prático do que um singleton…
Vejo vantagem em criar um singleton qdo eu precisasse herdar funcionalidades de alguma classe… Pois colocando todos os metodos estáticos não tenho como tirar proveito de uma herança…
Dizem que singleton é util tb para poder inicializar os objetos da classe de uma forma organizada em que seja importante a ordem com que os objetos sejam instanciados, mas isso tb é possivel utilizando um “bloco estático”…
Um facade por exemplo… é um singleton??? ou é mais prático fazer vários metodos estáticos???
Estado mantido de forma estatica numa aplicacao eh tao venenoso quanto variaveis globais. Nao importa como esse estado eh acessado. Seja via singletons ou metodos estaticos, vai continuar sendo venenoso.
Mas se você herdar a classe Singleton, ela vai deixar de ser singleton, pois você permitirá que qualquer subclasse crie uma instância da classe pai. (li isso no head first design patterns).
o CV tem MAIS do que razao. normalmente usamos singletons so para ter uma maneira de fazer lookup.
rarissimamente (posso ate arriscar um NUNCA) temos motivo para dizer que queremos apenas um objeto do tipo X na memoria.
em vez de metodos estaticos ou singletons, eu dou preferencia para injecao de dependecias de objetos estupidos (isto eh, objetos que tem um monte de metodozinhos simples, sem nenhum estado, diga-se atributos). ou entao voce cria apenas um no seu interceptor/filter/aspect e injeta sempre o mesmo. dando uma escopo “applications” pro objeto (aha! variavel global)
[quote=Fabrício Cozer Martins][quote=cv]Martins, o que seria uma ‘classe de matematica’? Pra mim, sqrt() eh um metodo que deveria existir em qualquer numero. Exemplo:
[code] >> 9.sqrt()
3
[/code]
:)[/quote]
Mas aí você estaria ‘inchando’ demais a classe Número
Eu costumo usar static somente para classes utilitárias de Texto, Número, Data, etc … não vejo mal algum nisso.
[/quote]
A solução do cv é interessante, mas o fabrício tem completa razão.
Sobre usar singleton ou não usar eu vou colocar como eu tomo essa decisão:
Se a classe tem estado interno, ou seja tem atributos que podem afetar outros métodos ou chamadas futuras ao próprio método então eu uso um sigleton, pois atributos estáticos não são uma boa técnica de programação;
Se o método não é afetado e também não afeta nenhum estado interno da classe ele deve ser estatico, não há razão pra usar sigleton neste caso.
[code]Sobre usar singleton ou não usar eu vou colocar como eu tomo essa decisão:
Se a classe tem estado interno, ou seja tem atributos que podem afetar outros métodos ou chamadas futuras ao próprio método então eu uso um sigleton, pois atributos estáticos não são uma boa técnica de programação;
Se o método não é afetado e também não afeta nenhum estado interno da classe ele deve ser estatico, não há razão pra usar sigleton neste caso.
Espero ter ajudado. [/code]
Martins,
Sobre isto que voce comentou é possivel voce nos dar um exemplo ?
Você, como todos que ainda não fizeram, deve ler o Effective Java do Joshua Bloch ou J2EE Design and Development do Rod Johnson. Principalmente o Effective Java pois nenhum programador Java pode ser classificado como médio sem o ter lido.
estou feliz de estar participando do meu primeiro fórum de Java, em 8 anos de programacao.
Venho do C# e conheci o Singleton através do meu professor de Java da minha escola.
Acabei implementando em Projetos na empresa onde Trabalho com C# e achei muito útil.
Porém nao vejo outra utilizacao pra Singleton que nao seja com Containers para armazenamento de Objetos de uma Classe.
Meus Objetos estao salvos e posso utilizados sem ter que instancialos diversas vezes e sempre que quiser (eles ja foram instanciados, por isso nao os considero de uma classe burra, como foi citado anteriormente aqui), além do mais com o Container Singleton nao preciso ficar acessando minha base de dados o tempo todo para fazer uma atualizacao ou preencher uma tabela, pesquisar dados. Faco tudo no Container, o que ajuda MUITO no tráfico de dados. Os dados podem ser entao salvos no Banco de Dados somente quando preciso.
Desculpa tirar a poeira deste post, mas me senti na obrigação:
[quote=groh]Oi a todos,
estou feliz de estar participando do meu primeiro fórum de Java, em 8 anos de programacao.
Venho do C# e conheci o Singleton através do meu professor de Java da minha escola.
Acabei implementando em Projetos na empresa onde Trabalho com C# e achei muito útil.
Porém nao vejo outra utilizacao pra Singleton que nao seja com Containers para armazenamento de Objetos de uma Classe.
Meus Objetos estao salvos e posso utilizados sem ter que instancialos diversas vezes e sempre que quiser (eles ja foram instanciados, por isso nao os considero de uma classe burra, como foi citado anteriormente aqui), além do mais com o Container Singleton nao preciso ficar acessando minha base de dados o tempo todo para fazer uma atualizacao ou preencher uma tabela, pesquisar dados. Faco tudo no Container, o que ajuda MUITO no tráfico de dados. Os dados podem ser entao salvos no Banco de Dados somente quando preciso.
Isto é, o que eles querem dizer com “classes burra” é que provavelmente este comportamento deveria estar em algum outro lugar que não está:
por exemplo o caso do método Math.sqrt, deveria estar na classe Integer, por que nós fazemos operações de raiz quadrada sobre um número, ou seja a classe Integer é “burra” por que deveria saber fazer raiz quadrada e não sabe.
Discordo do vc em sua opinião sobre singletons, eu sempre utilizo singletons quando quero utilizar objetos que não precisam de várias cópias.
Injeção de dependências é hoje uma boa metodologia de trabalho (o Spring é bom pra isso), mas há de convir que, algumas vezes é possível criar várias instâncias de determinados objetos quando se está injetando uma dependência.
Alguns serviços necessariamente devem ser singletons: ThreadPoolManager, por exemplo.
Atributo estático, que tal uma string de conexão com banco de dados?
para o colega ssousuke
Existe uma forma bem mais simples de se trabalhar com singleton do que sua metodologia.
Tente esse código aqui:
public class Teste {
private final static class SingletonHolder{
private final static Teste instance = new Teste();
}
public static Teste getInstance(){
return SingletonHolder.instance;
}
}
Já que seu singleton vai ser único em todo o contexto da aplicação, é mais simples fazer dessa forma.