Pergunta sobre Singleton

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!

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.

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

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:

 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;  
     }  
   
 }

precisa mesmo usar Singleton?! tem certeza?!

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.

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?

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:

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?

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

[quote=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???
[/quote]

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

[code]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());[/code]

[quote=sergiotaborda]Vc não precisa de um singleton. Vc precisa de um Registry
[/quote]

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?

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

(asneira…)

quote=sergiotaborda

[/quote]

Como?

[quote=rcarneiro]quote=sergiotaborda

[/quote]

Como?[/quote]

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

[quote=victorwss][quote=rcarneiro]quote=sergiotaborda

[/quote]

Como?[/quote]

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

Exatamente.

[quote=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![/quote]

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.

[code]/**

  • An interface defining objects that can create Singleton
  • instances.
    /
    public interface SingletonFactoryFunctor {
    /
    *
    • @return An instance of the Singleton.
      */
      public Singleton makeInstance();
      }
      [/code]
      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.

[code]/**

  • 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;
      }

}
[/code]
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