Singleton X Metodos Estátiscos

Boa Tarde,

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???

valeu

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.

Então… essa é uma regra da OO… e vc está certo!!! mas esse não é exatamente o foco da pergunta (qdo usar variaveis/metodos estaticas e qdo não usar…)

A pergunta na verdade é: qual a vantagem em criar um singleton ao invés de todos os métodos da classe estáticas??

até +

poder usar herança e polimorfismo ?

bom… Para usar polimorfismo como fariamos se o singleton diz que seu construtor deve ser private? usariamos então construtor protected certo?!?

imagino que o codigo da super classe ficaria assim:

public class Singleton {

    private static Singleton singleton;
    
    protected Singleton() {
    }
    
    public synchronized static Singleton getInstance() {
	
	if (singleton == null) {
	    
	    int tipoDoSingletonParaInstanciar = leUmArquivoTexto();
	    
	    if (tipoDoSingletonParaInstanciar == 1) {
		singleton = new SingletonSubclasse1();
	    } else if(tipoDoSingletonParaInstanciar == 2) {
		singleton = new SingletonSubclasse2();
	    } else {
		singleton = new Singleton();
	    }
	}

	return singleton;
    }
    
    public void metodoQuePodeSerSobrescrito() {
	System.err.println("Singleton.metodoQuePodeSerSobrescrito()");
    }
}

e da subclasse

é assim que vc ve o polimorfismo aplicado ao Singleton, ou a implementação não é bem essa… concordo que já é uma grande vantagem…

Bom… já estou convencido que o Singleton é “um cara legal”…

mas será que ele tem mais alguma vantagem???

valeu pessoal

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).

Mais importante, pra que vc vai precisar de uma subclasse de um objeto que so pode existir uma vez?

Alias, singletons desse tipo so existem uma vez por classloader – o que eh bem inutil, se for parar pra pensar.

Resumindo, nao use singletons - use injecao de dependencias pra configuracao, ou outros mecanismos que nao dependam de estado estatico. :wink:

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)

E isso por si so eh estado mantido de forma estatica, ja que a instancia do singleton eh mantida dessa forma :wink:

Da pra entrar em todo tipo de discussao teorica sobre isso, mas se vc quiser resumir bem:

  • Variaveis estaticas, so tipos primitivos ou imutaveis, e devem ser final
  • Singletons sao indicio de que vc precisa pensar melhor sua arquitetura
  • Metodos estaticos sao indicio de que seus objetos tao ficando “burros”

e como seria um método não burro para tirar a raiz quadrada numa classe de matemática ???
vc faria um singleton e um método não estático ???

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]

:slight_smile:

[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=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.

Espero ter ajudado.
[ ] ’ s e t +

E isso por si so eh estado mantido de forma estatica, ja que a instancia do singleton eh mantida dessa forma :wink:

Da pra entrar em todo tipo de discussao teorica sobre isso, mas se vc quiser resumir bem:

  • Variaveis estaticas, so tipos primitivos ou imutaveis, e devem ser final
  • Singletons sao indicio de que vc precisa pensar melhor sua arquitetura
  • Metodos estaticos sao indicio de que seus objetos tao ficando “burros”[/quote]

Inclui na lista:

  • ThreadLocal eh tao venenoso quanto. Eh o mesmo problema de lookup. E hoje em dia usado em MILHARES de lugares famosinhos por ai…

[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 ?

Abraços

Olá

Gilson

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.

[]s
Luca

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.

Abracos

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.

Abracos[/quote]

O que eles querem dizer com classe burra é isto:

http://martinfowler.com/bliki/AnemicDomainModel.html

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.

Abraços!

confesso q fiquei até com inveja deste post… seria bom se tivéssimos mais discussões desse nível!

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.