Duvida besta c Singleton

Seguinte, tava olhando alguns exemplos de SIngleton e queria escalrecer algumas duvidas bestas q tive…

Suponho q eu tenha seguinte classe usando Singleton:

public class Teste {

  private static Teste teste = null;
  //outra variaveis...

  private Teste() {
    ...
  }
  
  public synchronized static Teste getInstance() {
    ...
  }

   //outros metodos

}

Duvida eh a seguinte:
Pra acessar a instancia unica eu uso “Teste.getInstance()”.
A cada “Teste.getInstance()” ele retorna uma copia do objeto static teste, como se duplicasse, eh isso msm? Ou ele faz apontar p msm local de memoria da variavel teste da classe Teste sem duplicar?

So quero confirmar, p dps n ter q fazer refactor da classe dps, vlw…

Ele cria uma instância que fica referenciada dentro do atributo estático.
E retorna esta instância em todas as chamadas.

[quote=hlds]Ou ele faz apontar p msm local de memoria da variavel teste da classe Teste sem duplicar?

[/quote]

É isso mesmo que vc disse… todas as instancias estao apontando pro mesmo espaço na memoria…

No teu caso vai ser a mesma posição da memória.

mas creio que o certo seria objetos diferentes pra não dar zinabre mais tarde.

java.util.Calendar

public static Calendar getInstance()
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
	cal.sharedZone = true;
	return cal;
    }

Um Singleton significa que você só vai ter uma instância do Objeto em todo o seu programa.

quando chama seu método: getInstance() você deve retornar uma “REFERÊNCIA” da classe.

A implementação ficaria mais ou menos assim…


public synchronized static Teste getInstance() {   
     if(teste == null){
           teste = new Teste();
     }
     return teste;
}

O que acontece as vezes, é você achar que sua classe é um Singleton e não é… ex.:


public synchronized static Teste getInstance() {   
     teste = new Teste();
     return teste;
}

Aqui a cada chamado você instancia um novo objeto (mesmo não querendo que isso aconteça)

Ou você retornar uma referência nula da classe


public synchronized static Teste getInstance() {   
     return teste;
}

Seria uma boa pesquisar sobre Design Partners

http://www.guj.com.br/java.tutorial.artigo.137.1.guj

Zinabre ???

pq criar um singleton que vai retornar sempre uma nova instancia ?

Não entendi ?

[quote=ivo costa]No teu caso vai ser a mesma posição da memória.

mas creio que o certo seria objetos diferentes pra não dar zinabre mais tarde.

java.util.Calendar

public static Calendar getInstance() { Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault()); cal.sharedZone = true; return cal; } [/quote]
java.util.Calendar não é um singleton.

Eu pensei que ele queria retornar objetos novos…

Ai poderia ocorrer problemas de um lugar modificar o Objeto Teste e refletir em outras partes do programa.

[quote=ivo costa]Eu pensei que ele queria retornar objetos novos…

Ai poderia ocorrer problemas de um lugar modificar o Objeto Teste e refletir em outras partes do programa.[/quote]

mas ai nao seria um singleton…

só pra esclarecer… :wink:

[quote=pablofaria]Um Singleton significa que você só vai ter uma instância do Objeto em todo o seu programa.

quando chama seu método: getInstance() você deve retornar uma “REFERÊNCIA” da classe.

A implementação ficaria mais ou menos assim…


public synchronized static Teste getInstance() {   
     if(teste == null){
           teste = new Teste();
     }
     return teste;
}

O que acontece as vezes, é você achar que sua classe é um Singleton e não é… ex.:


public synchronized static Teste getInstance() {   
     teste = new Teste();
     return teste;
}

Aqui a cada chamado você instancia um novo objeto (mesmo não querendo que isso aconteça)

Ou você retornar uma referência nula da classe


public synchronized static Teste getInstance() {   
     return teste;
}

Seria uma boa pesquisar sobre Design Partners

http://www.guj.com.br/java.tutorial.artigo.137.1.guj[/quote]

Eu ja li p kct sobre o Singleton, eu sei q eh 1 instancia so p uma classe. Mas na verdade n me convenceu esse getInstance() retornar uma refenrecia p o objeto estatico e unico, entendeste? Nao sei se eh pq em Java eh costume nao trabalhar c passagem por referncia, bem nao sei, mas vou testar aqui com debug e ve se realmente aponta p msm endereco d memoria. Pra mim, esse getInstance() retorna uma copia do objeto unico, eu me convenci q so há uma instancia, mas, pra mim, pela implementacao desse getInstance() pensei q eram feitas copias e nao a passagem do msm endereco de memoria, vo testar e ver aqui.

Pelo q li, e como eu to querendo, gostaria q ele trabalhasse como se existisse uma Classe Variaveis por exemplo e nessas classes existissem apenas variaveis static. E pra acessar, utilizaria “Variaveis.var”. Pq desse jeito sim, ai concordo q eh so uma e nao ha copia nem nd. Eh p Singleton funcionar assim pelo q propoe, eu so quero confirmar. Espero n ter complicado…ehehehe

public synchronized static BD getInstance() throws Exception{ if( BD.instance == null ) { BD.instance = new BD(); } return BD.instance; }

sempre utilizei dessa forma e funciona… sem problemas…

Pronto… testei, debuguei, destrinchei, fuzilei e confirmei :smiley:

Realmente ele so cria uma instancia e essa instancia aponta p msm endereco de memoria. Fiz o teste ate passando a instancia por parametro em 1 metodo e continua apontando p msm endereco d memoria.

Detonado!!!

Comprovado então…

\o/