Você está na página 1de 24

Programação

Orientada a Objetos

Acessibilidade e Encapsulamento

Marum Simão Filho


marumsimao@gmail.com
Agenda
• Acessibilidade Pública
• Acessibilidade Privada
• Membros Públicos e Privados
• Representação Diagramática
• Métodos get e set
• Encapsulamento

2
Acessibilidade Pública e Privada
• O estado interno dos objetos deve ser mantido
sempre consistente.
• As variáveis de instância são responsáveis pelo
estado interno dos objetos.
• O acesso direto às variáveis de instância
através de outras classes pode comprometer o
estado interno dos objetos, pois pode levar a
situações inconsistentes.
• Não é recomendável também deixar que as
classes clientes sejam responsáveis pelas
validações das variáveis de instâncias de
nossas classes.
3
Acessibilidade Pública e Privada
• Exemplo:

class Cliente {
...
Data hoje = new Data();
hoje.mes = 15;
. . . Estado inconsistente

4
Acessibilidade Pública e Privada
• Para evitar que situações como essa ocorram,
uma boa prática é impedir acesso direto às
variáveis de instância dos objetos.
• Isso é alcançado declarando todas as variáveis
de instância com o modificador de acesso
private, isto é, a variável de instância passa a
ser visível (ou acessível) somente dentro da
própria classe onde é definida.
class Data
{
private int dia;
private int mes;
private int ano;
... 5
Acessibilidade Pública e Privada
• Dessa forma, um acesso como mostrado a
seguir vai acusar erro de compilação, impedindo
que ocorra o acesso direto às variáveis de
instância.

class Cliente
{
Data hoje = new Data();
hoje.mes = 15;
. . . Erro de compilação,
pois a varíavel tem
acesso privado à
classe que a definiu!
6
Acessibilidade Pública e Privada
• Mas como fazemos agora para atribuir valores
às variáveis dia, mes e ano da classe Data, se
não temos acesso fora dela?
• Simples, criamos métodos públicos para fazer
isso.
• Um método público é declarado com o
modificador de acesso public e torna o
membro visível a partir de qualquer outra classe.
• Dentro do novo método que chamaremos de
atribuirMes, faremos a validação da atribuição.

7
Acessibilidade Pública e Privada
class Data
{
private int dia;
private int mes;
private int ano;
public void atribuirMes(int m) {
if (m > 0 && m <= 12) {
mes = m;
}
else {
System.out.println (“mês inválido”);
}
}
...
8
Acessibilidade Pública e Privada
• O acesso agora seria realizado como mostrado
abaixo:

class Cliente
{

Data hoje = new Data();


hoje.atribuirMes(15); // OK
. . .

9
Acessibilidade Pública e Privada
• E se quisermos ler o valor de uma variável de
instância, como faremos?
• Precisamos definir um método também público
que retorne o valor de cada variável de
instância.
class Data
{ Mesmo tipo
int mes;
...
public int obterMes()
{
return mes;
}
... 10
Acessibilidade Pública e Privada
• O novo acesso agora seria realizado como
mostrado abaixo:
// dentro de um programa
Data hoje = new Data();
hoje.atribuirMes(3);
int m = hoje.obterMes(); Vai exibir o valor 3

System.out.println(m);
. . .

hoje dia = 0;
mes = 3;
ano = 0;

11
Acessibilidade Pública e Privada
• Representação:
– Membros públicos
• Modificador: public
• No diagrama UML: + (sinal de mais)
– Membros privados:
• Modificador: private
• No diagrama UML: - (sinal de menos)

12
Acessibilidade Pública e Privada
• Existem algumas convenções que padronizam os
nomes dos métodos de acesso às variáveis.
• São os chamados métodos get e set.
– Métodos de alteração do valor → set
– Métodos de obteção do valor → get
• A convenção usa o nome get ou set seguido do
nome da variável:
– setNomeDaVariavel
– getNomeDaVariavel
• Por exemplo:
– setMes – para atrituir valor à variável de instância mes
– getMes – para obter o valor à variável de instância mes
13
Acessibilidade Pública e Privada
• Assim:
– ao invés de usarmos atribuirMes, como anteriormente
usado, devemos usar setMes;
– ao invés de usarmos obterMes, como anteriormente
usado, devemos usar getMes.
• Essa convenção vale para todas as variáveis de
instância de uma classe.
• Os métodos get e set são sempre públicos.
• Uma classe pode ter vários outros métodos
públicos para realizar outras operações, como
por exemplo, incrementarAno(), exibir(), etc.

14
Acessibilidade Pública e Privada
class Data {
// variaveis de instancia
private int dia;
private int mes;
private int ano;

// metodos construtores
public Data() {
dia = 1; mes = 1; ano = 1900; }
public Data(int d, int m, int a) {
dia = d; mes = m; ano = a; }

// metodos get e set


public void setMes(int m) {
if (m > 0 && m <= 12)
mes = m; }
public void setDia(int d) {
if (d > 0 && d <= 31)
dia = d; } ... 15
Acessibilidade Pública e Privada
...
public void setAno(int a) {
if (a > 0)
ano = a; }
public int getDia() { return dia; }
public int getMes() { return mes; }
public int getAno() { return ano; }

// demais métodos
public void exibir()
{ ... }
public void incrementarAno()
{ ... }
public void incrementarAno(int anos)
{ ... }
private void algumMetodoInterno() // este método não
{ ... } // é visivel fora
} // fora da classe
16
Encapsulamento
• Encapsulamento consiste em separar os aspectos
externos de um objeto, que são acessíveis para
outros objetos, dos detalhes internos de
implementação do objeto [ Rumbaugh ];
• Qualquer mecanismo que nos permita “esconder”
a implementação do objeto fazendo com que
outros componentes do sistema não tenham
conhecimento do conteúdo interno dos dados
armazenados no objeto [ Yourdon ];
• É o resultado (ou ato) de se esconder os detalhes
de implementação de um objeto do usuário
[ Martin ].
17
Encapsulamento

18
Encapsulamento

propriedades privativas

dia = 15;
setMes() mes = 10; getMes()
ano = 2011;

métodos públicos

19
Encapsulamento

• Encapsulamento usa o mecanismo de


Information hiding.
• A comunicação entre objetos é feita
através de mensagens enviadas para as
operações.
• A implementação de um objeto pode ser
mudada sem afetar as aplicações que o
usam.
• Facilidade de manutenção.

20
Encapsulamento

Métodos públicos

Métodos privados Atributos privados

21
22
Revisão
1. Por que não se deve permitir acesso direto às
variáveis de instância de um objeto?
2. Como se bloqueia o acesso às variáveis de
instância de um objeto?
3. Já que as variáveis de instância devem ser
inacessíveis fora da classe, como deve-se
fazer para alterar e ler o valor das mesmas?
4. Qual o padrão internacional para nomes de
métodos de alteração e obtenção de variáveis
de instância?
5. O que é encapsulamento?
6. Como fazemos para encapsular uma classe?

23
Programação
Orientada a Objetos

Obrigado!!!

Marum Simão Filho


marumsimao@gmail.com

Você também pode gostar