Uma luz!

ola,
no meu outro post o pessoal me ajudou e consegui chamar uma clase pelo reflection,
mas eu queria saber agora como faço para que esta classe nao seja intasciada novament, pois esta clase chama um form de um JInternalFrame, eu li alguma coisa sobre SingleTon, alguem tem uma sugestao, por favor de como fazer, pois eu so quero abrir um JinternalFrame mesmo que eu clik no botao que aciona o reflection

Agora você pode escrever sua dúvida em português.

Segundo o GoF, o opbjetivo do Design Pattern ‘Singleton’ é: garantir que uma classe tenha somente uma instância e fornecer um ponto global de acesso a ela.

Ou seja: pelo singleton, quem faz a instancão (new Class()) é a própria classe. As outras somente irão instanciar a classe. Isso impede que sejam cirados vários objetos do mesmo tipo.

Para isso:

  • Vc deve ter o construtor privado. Se o construtor é privado, outras classes não poderão instanciá-la.
  • Ter um único método getInstance(). É este método quem fará acesso ao construtor da própria classe.

Um exemplo bem fácil: um spool de impressoras. é um único spool quem gerencia as impressoras.
No exemplo que eu peguei do GoF e adaptei, vou levar am consideração que vc tem uma classe ‘Printer’ que instancia as impressoras e uma classe ‘Doc’ que gerencia os documentos.

interface SpoolerIF

public interface SpoolerIF {
 public void addPrinter(Printer p);
 public void removePrinter(Printer p);
 public void addDoc(Printer p, Doc d);
 public void removeDoc(Printer p, Doc d);
 public void printNextDoc(Printer p);
}

singleton Spooler

public classe Spooler implements SpollerIF {
 /**coleção que guarda e manipula as impressoras*/
 private Map<String,Printer> printers;

 /**variável de classe que representa uma única instância*/
 private static SpoolerIF instance = null;

 /**contrutor privado. o compliador não vai gerar um construitor default*/
 private Spooler(){
   this.printers = new HashMap<String, Printer>();
 }

 /**método de acesso à instância única, por onde as demais classes irão acessar
 * Se a instancia for nulo, ou seja, se nunca foi acessada, o getInstance irá instancia-la.
 * Caso já tenha sido acessada, não irá mas acessá-la, mas retornará a instancia já criada.
 */
 public static SpoolerIF getInstance(){
   if (instance==null)
     instance = new Spooler();

   return instance
 }

 /**aqui vc implementa o restante dos métodos*/
}

Nos clientes que querem acessar a instnacia, vc deverá fazer

SpoolerIF spooll  = Spool.getInstance();

Perceba que não háverá, fora da classe proprietária, um new.
Se por acaso vc esquecer e tentar criar uma instancia fora da proprietária, não conseguirá pq o construtor é privado.

É isso…
Dá uma lida no livro de Padrões de Projeto do GoF e também no livro Padrões de Projeto em Java, que não lembro de quem é.
Espero ter ajudado.

valeu mesmo, vou dar uma olhada neste projeto,…

Só lembrando que esse padrão não funciona em Java, especialmente se:

  1. Você usar mais de um class loader (haverá um static por class loader);
  2. Você usar reflexão e coisas como "setAcessible(true);
  3. No caso do código do colega, o método getInstance() não é sincronizado. Então esse Singleton também não é seguro entre multiplas threads.

Na verdade, lazy loading em Singletons tras mas mal do que bem então, se não for um Singleton muito pesado de se carregar, prefira criar sua variável de instância diretamente.

eu vou começar a ler e aprender patterns, pois sou inciante, gostei dos links do berg, mas vini so pra adiantar e esclarecer algumas coisas. pois como ja falei sou inciante, ja começei um projeto desktop , usando conexao jdbc e nao estou usando threads para conexao. e este exemplo do berg me ajudou em nao instaciar duas vezes a mesma clase usando o reflection. entretanto vendo as suas considerações , me restou uma duvida incial, como eu faria para impedir a instanciação da mesma classe varias vezes, usando uma variavel de instancia diretamente. e se possivel dar start ou uma ideia sobre “lazy loading”.