Singleton

Estou implementando um projeto de um trabalho da faculdade onde faço uso de multiprogramação com threads. Duas das classes do projeto foram feitas de acordo com o padrão de projeto Singleton, onde vai existir apenas uma instância da classe. Para isso eu defini o construtor dessas classes como private e disponibilizei um método public para a criação da instância, como segue:
private static Relogio instancia;

private Relogio()
{
.
.
.
}
public static Relogio criaInstancia()
{
if (instancia == null)
instancia= new Relogio();
return instancia;
}

Porém, quando eu compilo o programa, dá uma mensagem nullPointerException justamente no teste if do método criaInstancia. Eu não tô entendendo por quê. Pois se instancia é static, não é necessário instanciar a variável antes de usá-la.

Tô precisando muito de ajuda!!!
Obrigado!!

realmente é estranho…
deveria funcionar

tenta:
if (MinhaClasse.instancia == null) …

Eu já tentei isso tb.
E além desse erro, quando eu crio uma referência para a classe Relogio usando: Relogio batida = Relogio.criaInstancia(); … e depois vou usar essa referência para acessar um método de relógio tal como: batida.getPulso ();… também dá o mesmo erro.

difícil dizer, já que seu código não está completo.

Relógio por acaso extende Date ou Calendar?

É uma inner class?

Não tem relação nenhuma com Date, por exemplo.
Como eu disse, é uma implementação com multiprogramação. E esta classe Relogio será o “clock” responsável pela sincronização das threads, já que se trata de um modelo síncrono.
Acho que isso não ajudou muito também… :roll:

Posta o código completo da classe aqui. E posta a mensagem de erro do compilador tb, pra facilitar.

Seu código parece certo, deve ser algo do tipo:

class Relogio
{
   private static Relogio relogio;
   private Relogio(){}
   public static getRelogio()
   {
      if (relogio == null)
       {
          relogio = new Relogio();
       }
       return relogio;
   }
}

Como é que tu esta entando criar a instancia para esta classe, se for no construtor: relogio rel = criaInstancia();
se for apartir de outra classe: relogio rel = relogio.criaInstancia();

Se tu estiver criando a instancia de modo adequado, o problema provavelmente esta em uma parte do código que tu não postou aqui.

[]

O código é meio grande… ficaria meio inviável colocar aqui. Mas eu posso adiantar que eu tô tentando criar uma instância em outra classe (No) da seguinte maneira: Relogio batida= Relogio.criaInstancia();.
Mas o primeiro problema a ser resolvido é o erro no teste if do método criaInstancia() de Relogio.

// método estático para recuperar a instância da classe public static Relogio criaInstancia() { if (instancia.equals(null)) { instancia= new Relogio(); } return instancia; }

Sendo que existe uma variável instancia do tipo Relogio declarada no início da classe.

instancia.equals(null) vai dar pai mesmo, pq qdo instancia for igual a null, equals não pode ser chamado nela…

O jeito certo é fazer (instancia == null)

Confere seu código nessa parte, pois na primeira mensagem estava certo, fazendo a comparação com ==.

[]'s
carisio

Na verdade eu havia tentado era == mesmo. Mas eu tentei equals() num momento de desespero para ver se poderia dar certo. Mas nenhum dos dois dá certo.

Olá,

vou insistir:

se o código é “meio grande”, dá pra considerar que este código tem mais de uma classe?

Este classe é inner (está dentro de uma outra classe) como por exemplo:

public class MeuProjetoFacul extends …
{

class Relogio
{

}
}

Neste tipo de construção, o construtor da clase “externa” poderá intervir na construção de Relogio.

Já tentou inicializar instancia na declaração?

private static Relogio relogio = new Relogio();

Se a classe é threadsafe, não teria problemas.

E por falar em threads (você falou aí em multiprogramação) como está a sincronização? Também neste caso, principalmente, a inicialização na declaração resolveria!

:grin: Desculpe a ausência. Mas eu voltei pra agradecer a ajuda de vcs. Suas dicas realmente me ajudaram muito.
Eu realmente estava usando a referência static instancia da maneira errada. Nem todos os lugares eu estava colocando da forma:

minhaclasse.instancia

o que levava ao erro.
Obrigado