[quote=beowulf][quote=ViniGodoy]Você pode usar o (argh) padrão Singleton. Ou pode passar sua lista por parâmetro para as várias classes que a utilizam.
A segunda opção é mais trabalhosa, mas gera menos bugs (embora numa aplicação simples dessa, dificilmente você terá problemas com o Singleton, só é bom já pegar o hábito de não usa-lo).[/quote]
Ola ViniGodoy, desculpa a pergunta, mais pq vc nao gosta do padrao Singleton?
E so uma pergunta, eu fiquei curioso.
At[/quote]
A pergunta foi pra o ViniGodoy e tenho certeza que ele escreverá uma resposta bem melhor que a minha. Mas acho que ele quis passar o conceito de injeção de dependências. Esse conceito é interessante para vc fazer um código mais testável. Usar um Singleton pode tornar sua classe intestável.
Ex clássico: suponhamos que vc cria uma infra para mandar mails. Então vc cria uma interface que represente e envie mails:
public interface MailInterface {
void enviarMail();
}
Aí então vc implementa um mail real, como Singleton, que envia para um monte de pessoas:
[code]package ex;
public class MailReal implements MailInterface {
private static final MailInterface instance = new MailReal();
static public MailInterface getInstance() {
return instance;
}
@Override
public void enviarMail() {
System.out.println("Enviando mail para 1000000 de pessoas");
}
private MailReal() {
super();
// TODO Auto-generated constructor stub
}
}[/code]
Aí então vc cria um gestor de mail:
[code]package ex;
public class GestorDeMail {
public void enviarMail() {
MailReal.getInstance().enviarMail();
}
static public void main(String[] args) {
GestorDeMail gestor = new GestorDeMail();
gestor.enviarMail();
}
}
[/code]
Legal, tudo funcionando e vc não cria vários mails reais apenas um. Mas e se vc kiser testar esse código aí? Vai enviar email pra uma porrada de gente em cada teste? e se para enviar pra tanta gente demorar uns 40 minutos? Vc vai esperar todo esse tempo só pra testar? Então o uso do Singleton de dentro da classe GestorDeMail, vc inviabilzou a realização de testes.
Aí entra a injeção de dependencias. Em vez do Gestor instaciar as classes que precisa, elas são injetadas nele. vamos refatorar. Vamos fazer com que a interface seja injetada através de um método set. Aí a gente precisa injetar a instancia da interface antes de executar. Perceba que estou utilizando a verdadeira refatoração, isto é, alterando o código de forma que ele continue fazendo a mesma coisa, e só a mesma coisa:
[code]package ex;
public class GestorDeMail {
private MailInterface mail;
public void setMail(MailInterface mail) {
this.mail = mail;
}
public void enviarMail() {
mail.enviarMail();
}
static public void main(String[] args) {
GestorDeMail gestor = new GestorDeMail();
gestor.setMail(MailReal.getInstance());
gestor.enviarMail();
}
}
[/code]
Agora a instancia é fornecida de fora da classe. Eu até continua injetando a dependecia através de um Singleton, mas minha classe GestorDeMail agora é testável. Isso eu considero um bom uso de Singleton, só que o pessoal não costuma ver muito isso pois em geral é usado um Conteiner para injetar dependêcias, como o Spring.
Mas cade o caso do teste que estou falando? Vamos a ele. Primeiro eu crio uma interface só para testar, que em geral é chamada de Stub, quando não executa nenhuma lógica, e Mock quando executa alguma lógica. Vou usar um Stub:
[code]package ex;
public class MailStub implements MailInterface {
@Override
public void enviarMail() {
System.out.println(“Manda mail só pra mim, pra não incomodar os outros”);
}
}
[/code]
Aí então agora eu posso criar uma classe para testar o Gestor:
[code]package ex;
public class TestarDeGestor {
/**
* @param args
*/
public static void main(String[] args) {
GestorDeMail gestor = new GestorDeMail();
gestor.setMail(new MailStub());
gestor.enviarMail();
}
}
[/code]
Perceba que agora eu consigo testar a classe, coisa que não seria possível com a primeira versão do GestorDeMail. Em geral o pessoal usa frameworks para testes e para produzir os mocks. Mas o importante é o conceito, não as ferramentas.
Espero que o exemplo clarifique as coisas.
[]s