Exercício de única instância

Na orientação a objetos existem os design patterns que são padrões projeto de código pautados em boas práticas. Dentre eles, está um chamado Singleton.

O objetivo deste exercício não é ainda se aprofundar os padrões de projeto, mas usar esse padrão (Singleton) como tema de estudo.

O Singleton é usado quando você deseja garantir que apenas uma instância (objeto) será criada de uma dada classe. Desse modo, é necessário se criar um mecanismo eficienciente no qual só seja possível se criar esse objeto único.

Tarefa do Registro Singleton

Retomando a classe Registro a seguir, que foi usada como exemplo para criar um contador compartilhado entre diversos objetos. O desafio é manter o atributo contadore o método proximoContador() como não estáticos, mas adaptar a classe de modo que seja possível se criar apenas uma instância de Registro. Com isso, obteremos o mesmo efeito de contador compartilhado, mas usando objetos. Isso será importante no futuro.

Você precisará usar métodos e atributos estáticos bem como precisará configurar o encapsulamento. Mas não deve transformar o atributo contador nem o método proximoContador em estáticos.


In [1]:
public class Registro {
   int contador = 0;
   
   int proximoContador() {
      contador++;
      return contador;
   }
}


Out[1]:
com.twosigma.beaker.javash.bkr43197d44.Registro

In [3]:
public class Registro {
   /* instancia */

   private int contador;
    
   private Registro() {
      contador = 0;
   }
   
   public int proximoContador() {
      contador++;
      return contador;
   }

   /* estatica */

   private static Registro reg = null;

   public static Registro instanciaRegistro() {
      if (reg == null)
         reg = new Registro();
      return reg;
   }
}


Out[3]:
com.twosigma.beaker.javash.bkr43197d44.Registro

In [4]:
Registro r1 = Registro.instanciaRegistro(),
         r2 = Registro.instanciaRegistro(),
         r3 = Registro.instanciaRegistro();

System.out.println("r2: " + r2.proximoContador());
System.out.println("r1: " + r1.proximoContador());
System.out.println("r3: " + r3.proximoContador());


r2: 1
r1: 2
r3: 3
Out[4]:
null