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.
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.
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:
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.
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!
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: