Singleton vs Static

Fala galera,

qual das duas vocês acham a melhor nesse caso? Por quê? Sim, eu sei que o ideal era não ter isso mas não tenho escolha.

public class Foo {
	private HashMap map = new HashMap();
	private static Foo _instance = new Foo();
	public static Foo getInstance() {
		return _instance;
	}
	public synchronized void put(Bar bar) {
		map.put(bar.getName(), bar);
	}
	public Bar get(String name) {
		return (Bar) map.get(name);
	}
}
public class Foo {
	private static HashMap map = new HashMap();
	public static synchronized void put(Bar bar) {
		map.put(bar.getName(), bar);
	}
	public static Bar get(String name) {
		return (Bar) map.get(name);
	}
}

Obrigado,
JP.

Gosto mais do primeiro, mas apenas para seguir o pattern.
Agora, não sei se há alguma diferença de performance ou coisa assim.

Curiosidade: Por que não tem escolha?

Legado. Refactoring proibido.

Se você não tem opção, a primeira lhe dá um objeto, a segunda duas funções e uma estrutura de dados.

Utilizando o singleton ao menos você lida com objetos, ganhando flexibilidade. Só veja se consegue fazer o getInstance() em um lugar apenas.

Ja parou pra pensar que o codigo eh legado justamente pq o refactoring foi proibido, e que todo codigo que nao eh mantido ‘em forma’ se torna legado?

Considere mudar de emprego :wink:

Ah, “e usar Singleton so pra seguir o pattern” nao ta certo nesse caso - a menos que o seu Foo represente uma entidade fisica que so pode mesmo existir uma vez por ClassLoader (e eu quase nunca vejo uma dessas).

E ae pessoal?

Esses dias me deparei com a mesma questão. :slight_smile:

A aplicação do padrão Singleton permite o refinamento dos métodos implementados em subclasses. Com métodos estáticos, esse recurso não é possível, considerando que não são polimórficos.

Uma explicação mais detalhada pode ser encontrado no seguinte livro:
LARMAN, C. Utilizando UML e Padrões. Bookman, 2002, 2ª Edição, Porto Alegre, RS.

Vale a pena dar uma olhada nele. É uma abordagem prática de padrões.

Até mais.

Só alertando q no 1o caso eh legal vc colocar um construtor private, senao vc nao garante q será singleton.

Singletons sao estado global da sua aplicacao. Se voce tinha nojo de variaveis globais, os mesmos principios se aplicam aqui, e vc devia ter nojo de singletons tambem.

http://www.google.com/search?q=singleton%20evil

A melhor dica (5 estrelas). Falando nisso, a TW não estaria precisando de um assistente de auxiliar de programador júnior? :stuck_out_tongue:

Bem lembrado, foi distração mesmo.

Valeu, gente.