Um dos pilares da orientação a objetos, o Encapsulamento é o conceito responsável pela definição de acessos as classes e seus métodos e atributos. Juntamente com a Herança e o Polimorfismo, itens essenciais a compreensão deste paradigma de programação.
3. Encapsulamento - Definição
• Encapsular seria o mesmo que esconder todos os membros
de uma
classe, além de esconder como funcionam as rotinas (no
caso métodos) do nosso sistema. Seria uma espécie de
proteção.
• Encapsular é fundamental para que seu sistema seja
suscetível a mudanças: não precisaremos mudar uma regra
de negócio em vários lugares, mas sim em apenas um único
lugar, já que essa regra está encapsulada.
Metodologia e Linguagem de Programação 4
4. Encapsulamento - Definição
• Para protegermos os atributos e métodos, por tanto,
podemos mudar seus modificadores. O principal deles é o
modificador private que faz com que ninguém consiga
modificar, nem mesmo ler, o atributo em questão.
• No exemplo a seguir, temos uma classe chamada
Funcionário com um atributo do tipo Double chamado
salário:
Metodologia e Linguagem de Programação 5
class Funcionario {
double salario ;
}
5. Encapsulamento - Definição
• No exemplo, o atributo salario pode ser acessado ou
modificado por código escrito em qualquer classe que
esteja no mesmo diretório que a classe Funcionario.
Portanto, o controle desse atributo é descentralizado.
• Como fazer para proteger o acesso a este atributo para que
ele não seja alterado por qualquer classe?
Metodologia e Linguagem de Programação 6
6. Encapsulamento - Definição
• Podemos fazê-lo incluindo o modificador Private no atributo.
Exemplo:
Metodologia e Linguagem de Programação 7
class Funcionario {
private double salario ;
void aumentaSalario ( double aumento ) {
// lógica para aumentar o salário
}
}
7. Encapsulamento - Definição
• Um atributo privado só pode ser acessado ou alterado por
código escrito dentro da classe na qual ele foi definido. Se
algum código fora da classe Funcionário tentar acessar ou
alterar o valor do atributo privado salario, um erro de
compilação será gerado.
• Por isso, apenas um método pertencente a própria classe
podem alterar o valor deste atributo. O intuito é ter sempre
um controle centralizado do dados dos objetos para facilitar
a manutenção do sistema e a detecção de erros.
Metodologia e Linguagem de Programação 8
8. Encapsulamento
Basicamente, usamos quatro tipos de encapsulamento que
são divididos em dois níveis:
• Nível de classe ou topo: Quando determinamos o acesso de
uma classe inteira que pode ser public ou package-
private (padrão);
• Nível de membro: Quando determinamos o acesso de
atributos ou métodos de uma classe que podem
serpublic, private, protected ou package-private (padrão).
Metodologia e Linguagem de Programação 9
9. Encapsulamento
• Public: O modificador public deixará visível a classe ou membro
para todas as outras classes, subclasses e pacotes do projeto Java.
• Private: O modificador private deixará visível o atributo apenas
para a classe em que este atributo se encontra.
• Protected: O modificador protected deixará visível o atributo para
todas as outras classes e subclasses que pertencem ao mesmo
pacote. A principal diferença é que apenas as classes do mesmo
pacote tem acesso ao membro. O pacote da subclasse não tem
acesso ao membro.
• Sem Modificador (Padrão ou Default): Por padrão, a linguagem
Java permite acesso aos membros apenas ao pacote em que ele
se encontra.
Metodologia e Linguagem de Programação 10
10. Métodos Privados
• O papel de alguns métodos pode ser o de auxiliar outros
métodos da mesma classe. E muitas vezes, não é correto
chamar esses métodos auxiliares de fora da sua classe
diretamente.
• No próximo exemplo, temos o método descontaTarifa()
como um método auxiliar dos métodos deposita()
e saca(). Além disso, ele não deve ser chamado diretamente,
pois a tarifa só deve ser descontada quando ocorre um
depósito ou um saque. Exemplo:
Metodologia e Linguagem de Programação 11
11. Exemplo:
Metodologia e Linguagem de Programação 12
class Conta {
private double saldo ;
void deposita ( double valor ) {
this.saldo += valor ;
this.descontaTarifa ();
}
void saca ( double valor ) {
this.saldo -= valor ;
this.descontaTarifa ();
}
// Método privado para que não seja alterado fora da classe
private void descontaTarifa () {
this.saldo -= 0.1;
}
}
12. Métodos Públicos
• Para que um método seja visível em outras classes, é
necessário que ele seja do tipo Public. Do contrário, seu
modificador será o padrão (default), que permite que ele
seja visível apenas dentro do próprio pacote de criação.
• Os pacotes em Java são os responsáveis pela organização do
projeto e pela proteção de parte do código em restrições
específicas. Exemplo:
Metodologia e Linguagem de Programação 13
13. Exemplo:
Metodologia e Linguagem de Programação 14
class Conta {
private double saldo ;
// Método público
public void deposita ( double valor ) {
this.saldo += valor ;
this.descontaTarifa ();
}
// Método público
public void saca ( double valor ) {
this.saldo -= valor ;
this.descontaTarifa ();
}
// Método privado
private void descontaTarifa () {
this.saldo -= 0.1;
}
}
14. MAS... Por quê encapsular?
Metodologia e Linguagem de Programação 15
15. MAS... Por quê encapsular?
• Uma das ideias mais importantes da orientação a objetos é o
encapsulamento. Encapsular significa esconder a
Implementação dos objetos. O encapsulamento favorece
principalmente dois aspectos de um sistema: a manutenção
e o desenvolvimento.
Metodologia e Linguagem de Programação 16
16. MAS... Por quê encapsular?
• A manutenção é favorecida pois, uma vez aplicado o
encapsulamento, quando o funcionamento de um objeto
deve ser alterado, em geral, basta modificar a classe do
mesmo.
• O desenvolvimento é favorecido pois, uma vez aplicado o
encapsulamento, conseguimos determinar precisamente as
responsabilidades de cada classe da aplicação.
• O conceito de encapsulamento pode ser identificado em
diversos exemplos do cotidiano.
Metodologia e Linguagem de Programação 17
17. MAS... E se tudo for encapsulado?
• Se todos os atributos forem do tipo Private, teremos um
acesso a esses atributos exclusivamente por Métodos.
Exemplo:
Metodologia e Linguagem de Programação 18
class Cliente {
private String nome ;
public String consultaNome () {
return this . nome ;
}
}
18. MAS... E se tudo for encapsulado?
• Da mesma forma, eventualmente, é necessário modificar o
valor de um atributo a partir de qualquer lugar do sistema.
Nesse caso, também poderíamos criar um método para essa
tarefa. Exemplo:
Metodologia e Linguagem de Programação 19
class Cliente {
private String nome ;
public void alteraNome (String nome) {
return this . nome = nome ;
}
}
19. Exercício 1
• Crie um projeto no Eclipse chamado Encapsulamento.
• Defina uma classe para representar os funcionários do banco
com um atributo para guardar os salários e outro para os
nomes.
• Crie uma classe Teste, testando a classe Funcionario, criando
um objeto e manipulando diretamente os seus atributos.
Metodologia e Linguagem de Programação 20
20. Exercício 2
• Modifique a classe anterior (Funcionario), utilizando os
conceitos de encapsulamento (tornando os atributos
privados). Depois, tente compilar a classe teste e observe o
resultado.
Metodologia e Linguagem de Programação 21
21. Exercício 3
• Crie métodos de acesso com nomes padronizados para os
atributos definidos na classe Funcionario (gets e sets).
• Altere a classe Teste também para que ela utilize os métodos
de acesso ao invés de manipular os atributos do objeto da
classe Funcionario diretamente.
Metodologia e Linguagem de Programação 22
22. Exercício 4
• Crie um método chamado Aumenta Salário dentro da classe
Funcionário, que deverá receber um valor e somar ao valor
do salário. Teste o mesmo dentro da classe Teste.
Metodologia e Linguagem de Programação 23
23. Exercício 5
• Crie um método chamado Descontos dentro da classe
Funcionário, que deverá subtrair de salario os descontos
(tipo INSS) do valor do salário. Teste o mesmo dentro da
classe Teste.
Metodologia e Linguagem de Programação 24