Prévia do material em texto
Encapsulamento Programação em Java Prof. Maurício Braga 2/27 Pilares da programação OO Encapsulamento Herança (Generalização/Especialização) Polimorfismo 3/27 Encapsulamento Separa a interface de um objeto dos detalhes de seu funcionamento interno 4/27 Encapsulamento Permite que uma aplicação seja construída a partir de um conjunto de componentes que realizam seu trabalho de forma independente. Cada componente contém tudo que precisa para realizar seu trabalho independentemente dos outros componentes. Estimula a divisão de responsabilidades: cada objeto faz apenas o que deve fazer, não realizando tarefas extras. 5/27 Encapsulamento A independência entre os objetos é obtida escondendo detalhes internos do funcionamento de cada componente, tornando o uso do componente acessível apenas através de uma interface externa. Facilita o controle ao acesso de informações do estado interno do objeto. Você não precisa saber como um telefone realmente funciona, para poder usá-lo. Só precisamos saber para que ele serve, e conhecer sua interface, ou seja a forma de nos comunicarmos com ele. 6/27 Encapsulamento Se a companhia telefônica mudar seus processos, você vai continuar usando o aparelho normalmente A implementação de uma classe, pode ser alterada sem afetar a sua interface. Se um novo telefone for criado, como um telefone digital, a implementação foi alterada, mas a interface permanece a mesma 7/27 Interface Lista de serviços oferecidos por um componente Funciona como um “contrato” que o componente estabelece com o mundo exterior que define exatamente como este pode fazer uso do componente Funciona como um “painel de controle” do componente. 8/27 Interface Formada por métodos e atributos públicos. Ausência de informações sobre como o trabalho é realizado. Liberdade para modificar o funcionamento do componente sem “quebra de contrato” com o mundo exterior. 9/27 Exemplo Encapsulamento Telefone interface pública- botões utilizados para interagir com o objeto implementação - as operações internas, o propósito do objeto Carro interfaces públicas - pedais, direção, câmbio implementação - o funcionamento do carro 10/27 Encapsulamento em Java - Métodos de acesso Junto com os métodos modificadores, viabilizam o encapsulamento. Métodos de acesso permitem acessar os atributos do objeto. 11/27 Métodos de acesso public String getNome() { return nome; } Tipo de retorno Nome do método Lista de parâmetros (vazia) Início e fim do corpo do método (bloco) Instrução de retorno Modificador de visibilidade 12/27 Encapsulamento em Java - Métodos modificadores Utilizados para modificar o estado de um objeto. Alcançados por meio da modificação do valor de um ou mais atributos do objeto. Geralmente contêm instruções de atribuição. Geralmente recebem parâmetros. 13/27 Métodos modificadores public void setNome(String nome_produto) { nome = nome_produto; } Tipo de retorno (void) Nome do método Parâmetro Modificador de visibilidade Atribuição Atributo sendo alterado 14/27 Exemplo Encapsulamento class Cliente { private double credito; private String nome; public String getNome() { return nome; } public void setNome(String nome_cliente) { nome = nome_cliente; } public void imprimaDadosCliente(Cliente c) { imprimir(c.nome, c.credito); } private void imprimir(String nome, double credito) { System.out.println(“Cliente: “ + nome + “ Crédito: R$ “ + credito); } } 15/27 Interface da classe Cliente public String getNome() public void setNome(String nomeCliente) public void imprimaDadosCliente(Cliente c) Note que o método privado imprimir não faz parte da interface! 16/27 Vantagens do encapsulamento Reutilização – Uma vez que o componente é independente, ele pode ser utilizado em diferentes programas com facilidade. Divisão de responsabilidades – Cada objeto faz apenas o que lhe é devido, não assumindo funções extras. Facilidade de modificação – Uma vez que o mundo exterior não conhece a implementação do componente, esta pode ser alterada sem problemas. Ausência de efeitos colaterais – Uma vez que o componente não depende de partes do seu programa para funcionar, não há risco dele modificar o funcionamento do programa. 17/27 Exemplo class ProdutoSemEncapsulamento { public int codigo; public String nome; public double preco; public double desconto_a_vista; } 18/27 Exemplo public static void main(String[] args) { ProdutoSemEncapsulamento p = new ProdutoSemEncapsulamento(); p.codigo = 1; p.nome = "Samsung 17 polegadas"; p.preco = 500; p.desconto_a_vista = 10; System.out.println("Preço à prazo: " + p.preco); System.out.println("Preço à vista: " + (p.preco – p.preco*p.desconto_a_vista/100)); } 19/27 Exemplo O que aconteceria se o programador tivesse digitado um desconto de 200? 20/27 Exemplo 21/27 Encapsulamento Exercício Corrija a classe do exemplo anterior (vista abaixo). Esta classe deverá usar encapsulamento, possuir um construtor, um método que calcula o preço a vista bem como um método setDesconto, que recebe o valor do desconto, e se o mesmo for superior a 100 ou menor que zero, configurar o desconto como zero. class ProdutoSemEncapsulamento { public int codigo; public String nome; public double preco; public double desconto_a_vista; } 22/27 Solução class Produto { private int codigo; private String nome; private double preco; private double desconto_a_vista; public Produto(int cod_prod, String nome_prod, double preco_prod, double desc) { codigo = cod_prod; nome = nome_prod; preco = preco_prod; desconto_a_vista = desc; } 23/27 Solução public double getPreco() { return preco; } public double getPrecoAVista() { double preco_a_vista; preco_a_vista = preco - preco*desconto_a_vista/100; return preco_a_vista; } public void setDesconto(double desc) { if ((desc > 100) || (desc < 0)) desconto_a_vista = 0; else desconto_a_vista = desc; } } 24/27 Exercício Crie uma classe para representar uma conta bancária. Esta classe deverá: Usar encapsulamento; Possuir dois atributos, código e saldo; Possuir um construtor que receba o número da conta e o saldo inicial. Se for passado um valor negativo para o saldo,utilizar zero como saldo inicial; Possuir métodos para creditar um valor, sacar um valor e imprimir o saldo. Se o valor a ser sacado for maior do que o saldo, sacar apenas o valor correspondente ao saldo (saldo será igual a zero), retornando o valor sacado em seguida. 25/27 Solução class Conta { private double saldo; private long numero; public Conta(long num, double val) { numero = num; if (val > 0) saldo = val; } public void creditar(double val) { saldo = saldo + val; } 26/27 Solução public double debitar(double val) { if (val > saldo) val = saldo; saldo = saldo - val; return val; } public void imprimaSaldo() { System.out.println(“Conta: “ + numero + “Saldo: R$ “ + saldo); } } Encapsulamento Programação em Java Prof. MaurícioBraga