Baixe o app para aproveitar ainda mais
Prévia do material em texto
ENCAPSULAMENTO Thaís Alves Burity Rocha Agenda Encapsulamento Pacotes e declarações import Modificadores de acesso Encapsulamento Capacidade de ocultar dados dentro de modelos, permitindo que somente operações especializadas os manipulem “Esconder” uma ideia, ocultando detalhes internos para o usuário do código Em Java, as classes são os modelos e é necessário fazer com que o acesso aos atributos seja feito somente através de métodos Exemplo de Falta de Encapsulamento Sistema bancário Do jeito visto até aqui, qualquer um pode atribuir o valor de saldo que quiser Não há nada que faça que somente os métodos de creditar() e debitar() alterem o valor do saldo Conta minhaConta = new Conta(“11139-2”, 500); minhaConta.saldo = 100000; Encapsulamento Possibilita a criação de programas com menos erros, mais claros e mais fáceis de manter Encapsular dados em modelos deve ser um dos principais objetivos do programador OO Classes são modelos, ou seja, abstrações da realidade Encapsulamento Em Java, é possível encapsular dados em classes utilizando modificadores de acesso sobre atributos e métodos que os manipulam Classes podem ser organizadas em “diretórios”, denominados pacotes É possível também utilizar modificador de acesso sobre uma classe para restringir o acesso à ela com base no pacote Logo, pacotes também podem ser interpretados como um meio de encapsulamento Introdução Exemplos Pacotes e Declarações Import Pacotes Mecanismo para organizar classes, tal como uma estrutura de diretório Delimita um espaço de nomes (namespace) Não é possível existir duas classes com o mesmo nome em um mesmo pacote O nome completo de uma classe é o nome do pacote + nome atribuído à classe Pacotes Quando não são definidos pacotes explícitamente, todas as classes são mantidas em um único pacote (default) É uma boa prática definir pacotes Recomendável que as classes em um mesmo pacote estejam relacionadas entre si Interface gráfica Estruturas de dados Banco de dados Pacotes A declaração do pacote deve ser a primeira coisa no arquivo de código-fonte que contém a classe Uso da palavra reservada package package pack1; class Conta{ double saldo; } Pacotes Convenção de nome Iniciar com o nome de domínio da empresa invertido Exemplo CESAR: www.cesar.org.br br.org.cesar.<nome que caracteriza classes do pacote> Pacote br.org.cesar.domain Classe br.org.cesar.domain.Doctor Declarações import Quando uma classe quer referenciar outra classe localizada em um pacote diferente, é recomendável usar a declaração de import Importação de uma classe de um pacote: Importação de todas as classes de um pacote: import <nome do pacote>.<nome da classe>; import <nome do pacote>.*; Declarações import A declaração de import deve vir antes da declaração da classe Fundamental para utilizar a biblioteca Java (API) Isso não significa que é obrigatória Declarações import: Exemplo package pack1; import pack2.Cliente; class Conta{ String numero; double saldo; Cliente cliente; void creditar(){} void debitar(){} } Declaração do pacote Declaração de “importação” da classe “pack2.Cliente” Variável de referência package pack2; class Cliente{ String cpf; double nome; ... } Declarações import: Exemplo E se o programador não quiser usar import? package pack1; class Conta{ String numero; double saldo; pack2.Cliente cliente; void creditar(){} void debitar(){} } Utiliza o nome completo da classe Classes Atributos Métodos Modificadores de acesso Modificadores de Acesso de Classes Definem a “visibilidade” da classe public A classe é acessível a partir de qualquer outra A classe pode ser instanciada A classe pode ser estendida (herança) Os métodos e atributos definidos pela classe podem ser acessados, dependendo de seus modificadores de acesso default Quando não é especificado Significa acesso em nível de pacote Modificadores de Acesso de Classes: Exemplos package pack1; import pack2.Conta2; import pack2.Conta3; public class Conta1{ double saldo; Conta2 conta2; Conta3 conta3; void creditar(){} void debitar(){} } package pack2; import pack1.Conta1; class Conta2{ Conta1 conta1; } package pack2; public class Conta3{ Conta2 conta2; } Código-fonte em Java No máximo, uma classe public por arquivo de código-fonte Pode conter várias classes que não sejam public Se houver classe public, nome do arquivo deve ser o nome da classe Se não há classe public, o arquivo pode conter qualquer nome Modificadores de Acesso de Atributos e Métodos Definem a “visibilidade” de atributos e métodos Retomaremos esse assunto depois de ver herança private Pode ser acessado apenas dentro da classe onde foi declarado public Pode ser acessado a partir de qualquer classe default Só pode ser acessado por classes no mesmo pacote protected Default + subclasses (herança) Modificadores de Acesso de Atributos e Métodos: Exemplos package pack1; public class Conta{ public String titular; String numero; private double saldo; private void creditar() {} public void debitar() {} double consultarSaldo() { return saldo; } } package pack1; public class MeuPrograma{ public void testar(){ Conta conta = new Conta(); conta.creditar(); conta.debitar(); double s1 = conta.consultarSaldo(); double s2 = conta.saldo; String nome = conta.titular; String numeroConta = conta.numero; } } Modificadores de Acesso de Atributos e Métodos: Exemplos package pack1; public class Conta{ public String titular; String numero; private double saldo; private void creditar() {} public void debitar() {} double consultarSaldo() { return saldo; } } package pack2; import pack1.Conta; public class MeuPrograma{ public void testar(){ Conta conta = new Conta(); conta.creditar(); conta.debitar(); double s1 = conta.consultarSaldo(); double s2 = conta.saldo; String nome = conta.titular; String numeroConta = conta.numero; } } Modificadores de Acesso de Atributos e Métodos: Exercício package pack1; class Conta{ public String titular; String numero; private double saldo; private void creditar(){} public void debitar(){} double consultarSaldo(){ return saldo; } } package pack2; import pack1.Conta; public class MeuPrograma{ public void testar(){ Conta conta = new Conta(); conta.creditar(); conta.debitar(); double s1 = conta.consultarSaldo(); double s2 = conta.saldo; String nome = conta.titular; String numeroConta = conta.numero; } } O método testar() executará corretamente? Modificadores de Acesso de Atributos e Métodos: Exercício (solução) package pack1; class Conta{ public String titular; String numero; private double saldo; private void creditar(){} public void debitar(){} double consultarSaldo(){ return saldo; } } package pack2; import pack1.Conta; public class MeuPrograma{ public void testar(){ Conta conta = new Conta(); conta.creditar(); conta.debitar(); double s1 = conta.consultarSaldo(); double s2 = conta.saldo; String nome = conta.titular; String numeroConta = conta.numero; } } A classe Conta não é visível fora de pack1! Modificadores de Acesso Não se aplicam à variáveis locais Variáveis declaradas dentro de métodos (ou outros blocos) Não são atributos public int somar (int a, int b){ int resultado = a + b; return resultado; } public int somar (int a, int b){ private int resultado = a + b; return resultado; } RESULTADO é uma variável local Boas Práticas de Programação OO Preferencialmente, declare os atributos como private Para permitir acesso de leitura a um atributo x, crie um método público getX que devolve x Para permitir acesso de escrita a um atributo x, crie um método público setX que modifica o valor de x Boas Práticas de Programação OO Exemplo: public class Cliente{ private String nome; private String cpf; public String getNome(){ return nome; } public void setNome(String nome){ this.nome = nome; } ... } Mudanças na forma de armazenar nome e cpf não afetam a utilização dos métodos get e set Boas Práticas de Programação OO Cuidado! Nunca crie um método sem haver uma real necessidade Muitas vezes getters e setters nunca são invocados e poderiam ser substituídos por outros métodos Na classe Conta, não faz sentido existir setSaldo() É mais adequado existir métodos de creditar() e debitar() O método debitar() deve verificar a disponibilidade de saldo para realizar a operação
Compartilhar