Pergunta sobre Singleton

18 respostas
ThiagoWorldCoder

No singleton, eu sei que eu garanto uma única instancia de uma classe durante toda a vida da minha aplicação.

Entretanto, eu estou precisando passar alguns valores para esse singleton, de modo que esses valores também não morram e possam ser trocados à qualquer hora!

por exemplo:

package testando;

public class Teste {

	private static Teste instance;

	public static String valor;
	
	public Teste() {
		// TODO Auto-generated constructor stub
	}
	
	public synchronized static Teste getInstance() {
		if(instance==null){
			System.out.println("Estou Aqui");
			instance = new Teste();
		}
		return instance;
	}

}

Eu preciso que a String valor (não sei se ela vai precisar ser static também), receba um valor em determinado caso, e em outro momento preciso receber de volta este valor que foi fixado… como faço isso???

valeu!

18 Respostas

T

ThiagoWorldCoder

Para que sua classe realmente seja singleton, seu construtor default deve ser private.

E o que você está querendo é só fazer o get e set do atributo depois você acessa assim:

Teste.getInstance().getNome(); Teste.getInstance().setNome("MinhaString");

Edit:
Oatributo não precisa ser static.

ThiagoWorldCoder

beleza… eu fiz o get e set… e coloque o valor num servlet e depois tentei recuperar em outro servlet o que eu havia colocado no singleton e não deu certo… mostrou null

peczenyj

bom, coloque o construtor como privador, não faz sentido vc construir um singleton com construtor publico.

quanto ao seu problema, sem ver parte do codigo fica dificil… não temos bola de cristal :wink:

ThiagoWorldCoder
package testando;  
   
 public class Teste {  
   
     private static Teste instance;  
   
     public static String valor;  
       
     public Teste() {  
         // TODO Auto-generated constructor stub  
     }  
       
     public synchronized static Teste getInstance() {  
         if(instance==null){  
             System.out.println("Estou Aqui");  
             instance = new Teste();  
         }  
         return instance;  
     }  
   
 }
Javabuntu

precisa mesmo usar Singleton?! tem certeza?!

S

cara, tem que tomar muito cuidado antes de se usar singletons, hj em dia é considerado um antipattern e existem melhores formas de se contornar o problema onde for necessário utilizar um singleton.

victorwss

Cara, singleton já é um belo gambi pattern. Você ainda quer combinar isso com um belo atributo public static?

Que horas que vai ser o velório da OO? Em qual cemitério ela vai ser enterrada?

peczenyj

Mas que bom que vc repetiu o código do primeiro tópico ao inves de mostrar como as suas servlets acessam esse singleton!

Assim só posso dizer que continuo sem bola de cristal para entender o que aconteceu :wink:

ThiagoWorldCoder

O que acontece é que eu preciso ter alguns objetos que vão ficar vivos durante toda a vida da aplicação. É só isso que eu preciso… e o que eu consegui até agora é utilizar o getServletContext().setAttribute(“objeto”, objeto);

alguém pode me dar uma opção melhor?

Rafael_Carneiro

Esse objeto será compartilhado por todos os usuários da aplicação ou ele é específico para cada usuário?

sergiotaborda
ThiagoWorldCoder:
No singleton, eu sei que eu garanto uma única instancia de uma classe durante toda a vida da minha aplicação.

Entretanto, eu estou precisando passar alguns valores para esse singleton, de modo que esses valores também não morram e possam ser trocados à qualquer hora!

por exemplo:
package testando;

public class Teste {

	private static Teste instance;

	public static String valor;
	
	public Teste() {
		// TODO Auto-generated constructor stub
	}
	
	public synchronized static Teste getInstance() {
		if(instance==null){
			System.out.println("Estou Aqui");
			instance = new Teste();
		}
		return instance;
	}

}

Eu preciso que a String valor (não sei se ela vai precisar ser static também), receba um valor em determinado caso, e em outro momento preciso receber de volta este valor que foi fixado.... como faço isso????

Vc não precisa de um singleton. Vc precisa de um Registry

class Registry {

    private static String  _valor;

    public static void setValor(String valor ){
          _valor = valor;
    }

    public static String getValor(){
    return _valor;
  }

}
// uso em algum lugar do sistema

Registry.setValor("olá");


// em outro lugar do sistema 

System.out.println(Registry.getValor());
Rafael_Carneiro

sergiotaborda:
Vc não precisa de um singleton. Vc precisa de um Registry

Criar um artefato a mais baseado em um padrão para disponibilizar um objeto na aplicação? Quando ele poderia utilizar os objetos ServletContext (como o autor do post mencionou) ou HttpSession?

victorwss

Que tal usar um ServletContextListener e colocar o objeto no ServletContext?

sergiotaborda

(asneira…)

Rafael_Carneiro

quote=sergiotaborda

[/quote]

Como?

victorwss

rcarneiro:
quote=sergiotaborda

Como?[/quote]

Ele postou alguma besteira, se arrependeu e decidiu apagar antes que pudesse criar algum problema.

sergiotaborda

victorwss:
rcarneiro:
quote=sergiotaborda

Como?

Ele postou alguma besteira, se arrependeu e decidiu apagar antes que pudesse criar algum problema.[/quote]

Exatamente.

Marcio_Duran
ThiagoWorldCoder:
No singleton, eu sei que eu garanto uma única instancia de uma classe durante toda a vida da minha aplicação. Entretanto, eu estou precisando passar alguns valores para esse singleton, de modo que esses valores também não morram e possam ser trocados à qualquer hora! valeu!

First, we create an interface for objects that create instances of the Singleton class. This is essentially a combination of the Abstract Factory, Factory Method and Functor patterns in the GoF book.

/**
 * An interface defining objects that can create Singleton
 * instances.
 */
public interface SingletonFactoryFunctor {
   /**
    * @return An instance of the Singleton.
    */
   public Singleton makeInstance();
}
Second, we create static wrapper for the Singleton class. Note that by separating the wrapper from the actual implementation, it is possible to both A) provide a well known access point for the Singleton instance and B) allow greater flexiblity as to which subclass to use to create the instance. Note that the wrapper could actually wrap a Singleton interface, rather than a concrete class.
/**
 * A static container for a single instance of the Singleton
 */
final public class SingletonWrapper {

   /**
    * A reference to a possibly alternate factory.
    */
 
   static private SingletonFactoryFunctor _factory = null;

   /**
    * A reference to the current instance.
    */
   static private Singleton _instance = null;
 

   /**
    * This is the default factory method.
    * It is called to create a new Singleton when
    * a new instance is needed and _factory is null.
    */
   static private Singleton makeInstance() {
      return new Singleton();
   }

   /**
    * This is the accessor for the Singleton.
    */
   static public synchronized Singleton instance() {
      if(null == _instance) {
         _instance = (null == _factory) ? makeInstance() : _factory.makeInstance();
      }
      return _instance;
   }
 
   /**
    * Sets the factory method used to create new instances.
    * You can set the factory method to null to use the default method.
    * @param factory The Singleton factory
    */
   static public synchronized void setFactory(SingletonFactoryFunctor factory) {
      _factory = factory;
   }
 
   /**
    * Sets the current Singleton instance.
    * You can set this to null to force a new instance to be created the
    * next time instance() is called.
    * @param instance The Singleton instance to use.
    */
   static public synchronized void setInstance(Singleton instance) {
      _instance = instance;
   }
 
}
Clients that use this SingletonWrapper need only use something like SingletonWrapper.instance().method().

Note that since SingletonWrapper is final, the instance method can essentially be inlined. Hence the only real over-head here is the check if _instance is null. (Even this could be removed, if we refactor the class to ensure that _instance is never null. For example:

* create a new instance when the class is loaded via a static initializer
* create a new instance when a new factory is assigned via setFactory
* make sure setInstance is never used to change _instance to null, or create a new instance if it is)

This approach allows us to easily alter the specific Singleton instance published--either dynamically or at compile-time--without altering the code that uses the Singleton. Moreover, the Singleton itself need not be aware of the Singleton functionality. Hence this SingletonWrapper can be created for pre-existing classes such as those provided with an API or framework.

[size=18]FONTE:[/size]

:arrow: http://radio.weblogs.com/0122027/stories/2003/10/20/implementingTheSingletonPatternInJava.html

Criado 6 de novembro de 2008
Ultima resposta 7 de nov. de 2008
Respostas 18
Participantes 9