[quote=cv][quote=PedroTOliveira]Eu discordo que singleton é um padrão ruim para aplicações WEB.
Muito pelo contrário em um contexto de injeção de dependências e se tratando da camada de serviços, singleton são bem aceitos.[/quote]
Primeira vez que eu vejo alguem dizer isso sem um smilie na frente pra indicar que era piada. Eu vacilei e nao percebi o sarcasmo, ou vc ta mesmo falando serio?
Injecao de dependencias existe EXATAMENTE pra nao ter que ficar com estado global/estatico compartilhado entre instancias. Vai totalmente contra a ideia de que “singletons sao bem aceitos”.
Static Singleton? Porréssa? E o que seria um Dynamic Singleton, diga-se?
[/quote]
Você tem razão, o termo Static Singleton foi infeliz, eu coloquei na cabeça esse termo, por causa da forma como design pattern é aplicado e explicado.
Tem haver com a forma de declarar a instancia da classe de forma static.
Mas também considero que “Singleton” quer dizer:
Garanto que tenho somente uma única instancia dessa classe dentro desse contexto de aplicação.
Tipo:
public class ServicesManager {
private static final Map services = new HashMap();
static {
try {
services.put("LoginService", Class.forName("com.guj.LoginService").newInstance());
services.put("RegisterService", Class.forName("com.guj.RegisterService").newInstance());
} catch (ClassNotFoundException ex) {
//sei lah
}
}
public static Service getService(String service) {
if (services.containsKey(service)) {
return services.get(service);
} else {
throw new IllegalArgumentException("Service Not Found");
}
}
}
Nesse caso eu não poderia considerar que meu LoginService um Singleton?
Opa, nosso Map também é uma única instancia! (Aqui teriamos um Singleton?).
Não é próximo do que o container de injeção de dependências faz ?
Porquê na documentação do Spring eles se referem aos beans como sendo por “default” configurados como “Singletons”?
Edit: Acho que a tempo ainda.
O papel container de Injeção de Dependências / IOC, para mim, tem mais haver com uma forma de fazer com que certa dependência seja injetada de forma mais “configurável” do que com a eliminação de estado global/estático entre instancias (Por sinal dependendo da implementação/configuração o container não resolve isso).
Outro ponto, é possível injetar dependencias (por default: singletons) de forma dinâmica utilizando recursos AOP e Auto-Wiring do Spring, (Dynamic Singletons?) porém se seus beans possuem atributos compartilhados, você vai ter problemas de classloaders e concorrência do mesmo jeito. (O Container no caso não resolve a questão dos classloaders que o Vini comentou).