Encapsulamento

Retomando Circulo

Retomando a classe cículo.

  • Projeto inicial de manter o cálculo da área em um atributo.
  • Cálculo feito no construtor.

In [1]:
public class Circulo {
   int centroX, centroY;
   int raio;
   double area;
   
   Circulo(int centroX, int centroY, int raio) {
      this.centroX = centroX;
      this.centroY = centroY;
      this.raio = raio;
      this.area = Math.PI * raio * raio;
   }
}


Out[1]:
com.twosigma.beaker.javash.bkre5084374.Circulo

In [2]:
Circulo circ = new Circulo(5, 3, 10);
  
System.out.println("Circulo: centro(" + circ.centroX + ", " + circ.centroY + "), raio " + circ.raio);
System.out.println("Area do circulo: " + circ.area);


Circulo: centro(5, 3), raio 10
Area do circulo: 314.1592653589793
Out[2]:
null

Transformando o Atributo em Método

  • Como manter a consistência se o raio for modificado?
  • Projeto resolve realizar o cálculo sobre demanda através de método.

In [3]:
public class Circulo {
   int centroX, centroY;
   int raio;
   
   Circulo(int centroX, int centroY, int raio) {
      this.centroX = centroX;
      this.centroY = centroY;
      this.raio = raio;
   }
   
   double area() {
      return Math.PI * raio * raio;
   }
}


Out[3]:
com.twosigma.beaker.javash.bkre5084374.Circulo

In [4]:
Circulo circ = new Circulo(5, 3, 10);
  
System.out.println("Circulo: centro(" + circ.centroX + ", " + circ.centroY + "), raio " + circ.raio);
System.out.println("Area do circulo: " + circ.area());


Circulo: centro(5, 3), raio 10
Area do circulo: 314.1592653589793
Out[4]:
null

Aplicando Encapsulamento na classe Circulo

Diretrizes para classe e respectivos objetos:

  • atributos – privados
  • métodos - podem ser públicos
    • métodos serão privados se não se quiser expô-los publicamente.
  • O objeto torna-se uma caixa preta em que só aparece o suficiente para que objetos externos possam utilizá-lo.
  • Detalhes de implementação ficam escondidos do público.

In [5]:
public class Circulo {
   private int centroX, centroY;
   private int raio;
   public Circulo(int centroX, int centroY, int raio) {
      this.centroX = centroX;
      this.centroY = centroY;
      this.raio = raio;
   }
   public double area() {
      return Math.PI * raio * raio;
   }
}


Out[5]:
com.twosigma.beaker.javash.bkre5084374.Circulo

In [6]:
Circulo circ = new Circulo(5, 3, 10);
  
System.out.println("Area do circulo: " + circ.area());


Area do circulo: 314.1592653589793
Out[6]:
null

Propriedades

  • Expõem indiretamente atributos para classes/objetos externos através de métodos.
  • Métodos podem ser mantidos/adaptados com mudanças de atributos:
    • Interface se mantém mesmo com mudanças externas.
  • Permitem consistência perante mudanças.

Propriedades em Java

  • Expostas através de métodos:
    • prefixo “get” → leitura
    • prefixo “set” → modificação

Consistência

O acesso indireto através do método permite a garantia de consistência do valor. Vide método setRaio abaixo que não aceita valor negativo.

Propriedades sem Atributo correspondente

Propriedades não estão obrigadas a estar associadas a atributos. Veja propriedade getArea() abaixo.


In [7]:
public class Circulo {
   private int centroX = 0,
               centroY = 0;
   private int raio = 1;
   
   public int getCentroX() {
      return centroX;
   }

   public void setCentroX(int centroX) {
      this.centroX = centroX;
   }

   public int getCentroY() {
      return centroY;
   }

   public void setCentroY(int centroY) {
      this.centroY = centroY;
   }

   public int getRaio() {
      return raio;
   }

   public void setRaio(int raio) {
      if (raio > 0)
         this.raio = raio;
   }

   public double getArea() {
      return Math.PI * raio * raio;
   }
}


Out[7]:
com.twosigma.beaker.javash.bkre5084374.Circulo

In [8]:
Circulo circ = new Circulo();
circ.setCentroX(5);
circ.setCentroY(3);
circ.setRaio(10);
  
System.out.println("Circulo: centro(" + circ.getCentroX() + ", " + circ.getCentroY() + "), raio " + circ.getRaio());
System.out.println("Area do circulo: " + circ.getArea());


Circulo: centro(5, 3), raio 10
Area do circulo: 314.1592653589793
Out[8]:
null

Propriedades Somente Leitura

Não definem o método “set”.

Veja classe reescrita para propriedades só de leitura.


In [9]:
public class Circulo {
   private int centroX, centroY;
   private int raio;
   
   public Circulo(int centroX, int centroY, int raio) {
      this.centroX = centroX;
      this.centroY = centroY;
      this.raio = raio;
   }

   public int getCentroX() {
      return centroX;
   }

   public int getCentroY() {
      return centroY;
   }

   public int getRaio() {
      return raio;
   }

   public double getArea() {
      return Math.PI * raio * raio;
   }
}


Out[9]:
com.twosigma.beaker.javash.bkre5084374.Circulo

In [10]:
Circulo circ = new Circulo(5, 3, 10);
     
System.out.println("Circulo: centro(" + circ.getCentroX() + ", " + circ.getCentroY() + "), raio " + circ.getRaio());
System.out.println("Area do circulo: " + circ.getArea());


Circulo: centro(5, 3), raio 10
Area do circulo: 314.1592653589793
Out[10]:
null

Tarefa

Classe Grafico com Propriedades

Retomando a classe Grafico feita anteriormente (copiada abaixo), modifique classe para que atenda as regras de encapsulamento e para que seus atributos sejam acessados através de propriedades.


In [11]:
public class Grafico {
   boolean preenchido;
   char caractere;
   
   Grafico(boolean preenchido, char caractere) {
      this.preenchido = preenchido;
      this.caractere = caractere;
   }

   void plota(int valor) {
      for (int v = 1; v < valor; v++)
         System.out.print((preenchido) ? caractere : ' ');
      System.out.println(caractere);
   }
}


Out[11]:
com.twosigma.beaker.javash.bkre5084374.Grafico

In [12]:
Grafico g1 = new Grafico(true, '#');
Grafico g2 = new Grafico(false, '*');

g1.plota(10);
g1.plota(12);
g1.plota(8);
System.out.println();
g2.plota(4);
g2.plota(5);
g2.plota(7);


##########
############
########

   *
    *
      *
Out[12]:
null

In [ ]:
## Aplicação para a Nova Classe `Grafico`

Reescreva o programa exemplo para a sua nova classe `Grafico`.