Gestão Academica em Java - aula5 - encapsulamento

Gestão Academica em Java - aula5 - encapsulamento

Programação Orientada a Objetos Encapsulamento

Encapsulamento de Dados

Ocultação de dados

Garante a transparência de utilização dos componentes do software, facilitando:

Entendimento Reuso

Manutenção

Encapsulamento

Minimiza as interdependências entre módulos, através da definição de interfaces externas (serviços).

Classe como “caixa preta”.

Não se conhece seu funcionamento internamente, apenas se sabe como utilizar.

A interface (métodos públicos) de uma classe declara todas as operações acessíveis a outras classes.

Encapsulamento

Todo o acesso aos dados é feito através de chamada a serviços conhecidos como getters

(Recuperadores de atributos) e setters (modificadores de atributos).

As mudanças na implementação interna do objeto (que preservem a sua interface externa) não afetam o resto do Sistema.

Encapsulamento

Benefícios

Segurança: protege os objetos de terem seus atributos corrompidos por outros objetos.

Independência: “escondendo” seus detalhes de implementação, uma classe evita que outras fiquem dependentes de sua estrutura interna

Encapsulamento

Tipos de Visibilidade:

Em sistemas orientados a objetos, ha diferentes tipos de visibilidade de atributos e métodos. Os principais são:

−Publico – objetos de outras classes possuem acesso direto.

−Privado – o acesso e restrito ao interior da classe.

−Protegido – o acesso e restrito as classes do mesmo pacote, e as subclasses em qualquer pacote.

−Pacote – o acesso e restrito as classes do mesmo pacote.

Encapsulamento

publico: palavra reservada – public privado: palavra reservada – private

protegido: palavra reservada – protected

package: (default) – sem modificador

Em UML:

Publico: + Privado: -

Protegido: #

Encapsulamento

Exercício: teste a diferença entre as quatro formas de visibilidade.

Encapsulamento

Para inserir uma classe em um pacote (existente ou não):

package teste; import java.util.*; class Teste {

Encapsulamento Para importar as classes do pacote:

package Teste2; import teste.*; OU import teste.Teste; class Horario {

Encapsulamento Exemplo de uso de visibilidade na UML

Encapsulamento

Getters & Setters (interface de acesso) public class Funcionario extends Pessoa{ private float salario; private int horasExtras; public boolean setSalario(float salario) { if (salario > 0) { this.salario = salario; return true; else return false;

} public float getSalario() { return this.salario;

Encapsulamento

Utilização dos getters & setters

Funcionario f; f = new Funcionario();

… System.out.println(f.getSalario());

Encapsulamento

Os atributos private não são visíveis na subclasse, apesar de serem herdados.

Eles devem ser acessados através de getters e setters herdados.

Encapsulamento

A visibilidade dos métodos sobrescritos pode mudar, mas, apenas para dar mais acesso.

Por exemplo: um método declarado na superclasse como protected pode ser redefinido protected ou public, mas não private ou com visibilidade de pacote.

Encapsulamento

Implementação de relações com encapsulamento

Exemplo:Considere a seguinte relação de 1 para 1.

Encapsulamento Encapsulamento

Encapsulamento Relacao unidirecional

Encapsulamento Encapsulamento

Encapsulamento

Utilização em uma suposta classe cliente class Principal{ public static void main(String args[]){

A a = new A();

B b1 = new B();

B b2 = new B();

Encapsulamento

Exercício:

– Modifique a classe A para que as referências a classe B passem a ser armazenadas em um vetor de duas posições.

– Analise qual o impacto desta modificação na classe cliente, neste caso, a classe Principal.

Encapsulamento

Exemplo: Relações de 1 para n : Diagrama de classes UML

Encapsulamento Relações de 1 para n : implementação

Encapsulamento

Utilização em uma classe cliente:

class Principal{ public static void main(String args[]){

A a = new A();

B b1 = new B(a);

B b2 = new B(a);

B bn = new B(a); a.addB(b1); a.addB(bn); }

Encapsulamento

A classe ArrayList implementa a noção de array de capacidade variável e "ilimitada".

Índice começa no zero!

Importar import java.util.ArrayList; import java .util.*;

Classe ArrayList

Métodos principais:

void add(int index, Object element) coloca o elemento na posição indicada void add (Object element) coloca o elemento no fim do Vector void clear() remove todos os elementos boolean contains(Object element)retorna true se o Vector contém o elemento indicado

Object elementAt(int index) ou

Object get(int index) retorna o elemento que esta na posição indicada

Object firstElement() retorna o elemento que esta na primeira posição (index=0) do Vector object remove(int index) remove o elemento que esta na posição indicada boolean remove(Object element) remove a primeira ocorrência do elemento

Object set(int index, Object elelement) substitui o elemento na posição indicada pelo elemento passado pelo argumento int size() retorna a dimensão atual do Vector

Encapsulamento

● Alteração da implementação usando a classe ArrayList class A { private ArrayList<B> bs = new ArrayList<B>(); public void addB(B b){

Encapsulamento

● Qual o impacto desta mudança na classe cliente (neste caso, a classe Principal) ?

Comentários