Upload
marcello-thiry
View
745
Download
7
Embed Size (px)
DESCRIPTION
Material utilizado na disciplina de Programação Orientada a Objetos (animações e outros efeitos foram perdidos no carregamento). Ciência da Computação (3o período). Universidade do Vale do Itajaí - Campus Kobrasol.
Citation preview
Prof. Marcello Thiry <[email protected]>
PROGRAMAÇÃO ORIENTADA A OBJETOS
Unidade 1 (parte 2)
3º período
Legenda usada nos slides3
Conceito-chave: definição fundamental no contexto da Orientação a Objetos (OO).
Importante: informações complementares, mas relevantes para o entendimento da OO.
Atenção: você deve ficar atento para não cair em armadilhas ou falhas de entendimento.
Você lembra...4
E se criarmos outro objeto...5
umaPessoa e outraPessoa apontam para o mesmo objeto?
umaPessoa e outraPessoa têm o mesmo estado?
O que isso significa?
Revisando...7
umaPessoa e outraPessoa são objetos diferentes
Apontam para áreas de memória diferentes
umaPessoa e outraPessoa podem ter o mesmo estado num determinado momento
Duas variáveis com o mesmo valor não são a mesma variável
Como funciona... 8
Endereço Valor
100 ??
101 ??
102 ??
103 ??
104 ??
105 ??
106 ??
... ...
umaPessoa
Como funciona... 9
Endereço Valor
100 ??
101 ??
102 ??
103 ??
104 ??
105 ??
106 ??
... ...
umaPessoa
Como funciona... 10
Endereço Valor
100 ??
101 ??
102 nome = “ ”......
103
...
200 ??
201 ??
... ...
umaPessoa
novo objeto Pessoa
102
Como funciona... 11
Endereço Valor
100 102
101 ??
102 nome = “ ”......
103
...
200 ??
201 ??
... ...
umaPessoa
novo objeto Pessoa
“Marcello”
Como funciona... 12
Endereço Valor
100 102
101 201
102 nome = “Marcello”......
103
...
200 ??
201 nome = “João”......
...
...
umaPessoa
outraPessoa
E se...13
O que você acha que irá acontecer?
Experimente imprimir o nome de umaPessoae outraPessoa e analisar o resultado...
Vamos colocar a mão na massa!!!14
A partir das atividades anteriores, exercite o que acabamos de discutir e tente explicar o resultado
Depois, altere o nome de umaPessoa e imprima novamente: o que aconteceu?
Antes, vamos voltar a alguns conceitos-chave...17
O que você entende por reutilização?
Copiar e colar?
Faz sentido?
Qual o risco?
Duplicar código é reutilizar?
Como você trabalha reutilização?18
Como você trabalha com sub-rotinas?
Procedimentos
Funções
Parâmetros
E agora, classes e objetos!!!
Lembra da abstração?
Vamos analisar...19
Duplicação de código...21
Voltando a análise....23
Como um Aluno saberá fazer o que uma Pessoa já faz?
Você já parou para pensar que faz sentido dizer:
Um Aluno é uma Pessoa
Legal, mas como iremos fazer isso acontecer?
Generalização24
Relacionamento que indica Herança
O sentido do relacionamento é da classe mais especializada (subclasse) para a mais genérica (superclasse)
Aluno é a subclasse (mais especializada)
Pessoa é a superclasse (mais genérica)
Generalização25
A subclasse herda todos os atributos e operações da
superclasse
Cada objeto (instância) da subclasse é também uma instância indireta da superclasse
A superclasse tem um nível de abstração maior do que a subclasse
Generalização / Especialização26
Sentido da generalização
Sentido da especialização
Generalização em Java29
Generalização em Java30
Revendo os tipos de herança33
Herança simples
A subclasse herda suas características e comportamento de uma única superclasse
Herança múltipla
A subclasse herda suas características e comportamento de duas ou mais superclasses
Herança múltipla em Java35
A linguagem Java implementa somente herança simples
É possível utilizar Interfaces e Composição para simular parcialmente aspectos da herança múltipla
Voltaremos a discutir Interfaces e Composição em aulas futuras
Algumas linguagens OO, como C++ e Common Lisp (CLOS) implementam herança múltipla
Considerações sobre herança múltipla36
A subclasse precisa ter uma relação “é um” com todas as suas superclasses
Deve-se utilizar com cuidado para evitar que o modelo fique confuso e de difícil manutenção
38Linguagens OO que implementam herança
múltipla devem fornecer soluções
para mitigar este problema
Você já perguntou sobre...39
... o significado dos modificadores de visibilidade
“–” e “+” nas classes modeladas com UML?
... a utilidade dos modificadores de acesso “private” e “public” em Java?
Visibilidade e modificadores de acesso40
Notação visual
Modificadorde acesso
A parte é visível...
+ publicdentro da própria classe e para qualquer outra classe
– private somente dentro da própria classe
# protectedsomente dentro do próprio pacote e das subclasses em outros pacotes
~ packagesomente dentro da própria classe e das classes dentro do mesmo pacote
Visibilidade “package” em Java41
Para representar a visibilidade “package”, você não deve especificar um modificador de acesso
Quando não é especificado um modificador de acesso, o Java assume que a visibilidade é do tipo “package”
Visibilidade “package” em Java42
Para cada arquivo “.java” deve haver, pelo menos, uma classe “public” com o mesmo nome do arquivo
As demais classes declaradas no mesmo arquivo devem ser “package”
Ou seja, não devem especificar um modificador de acesso
Visibilidade de atributos e operações43
Modificador na ClasseAlfa ClasseAlfa ClasseBeta SubAlfa Gama
public S S S S
protected S S S N
sem modificador S S N N
private S N N N
Na prática, adotaremos...44
As classes serão públicas Uma única classe em cada arquivo “.java”
Logo, o nome da classe e do arquivo deve ser o mesmo
Atributos serão sempre privados Operações podem ser “públicas”, “privadas” ou
“protegidas”
Exceções devem ser tratadas com parcimônia!!
Continuando com a análise...45
Imagine que você foi contratado para desenvolver um sistema acadêmico (matrícula, notas, diários, planos de ensino) para uma universidade
Quais as principais entidades envolvidas?
Continuando com a análise...46
Você pensou primeiro em Pessoa ou em Aluno, Professor, Funcionário, Turma, Disciplina, etc.?
Aluno, Professor e Funcionário são entidades do mundo real que são percebidas pelos usuários
Não parece fazer sentido criar um objeto Pessoa. Ele seria genérico demais e sem muita utilidade...
Você concorda?
Continuando com a análise...47
Tipicamente, ao analisar os requisitos para desenvolver um sistema, percebemos primeiro entidades do
domínio de negócio
Entretanto, muitas vezes, estas entidades possuem similaridades entre si...
Lembra do conceito de classe?
48
As similaridades entre as entidades podem ser abstraídas numa superclasse comum
Por exemplo, as classes Aluno, Professor e Funcionário poderiam compartilhar a superclasse Pessoa
Tente modelar estas classes antes de prosseguir...
Continuando com a análise...
Classes Concretas e Abstratas50
Classe Concreta é uma classe que pode ser instanciada diretamente
Classe Abstrata é uma classe que NÃO pode ser instanciada diretamente
No nosso exemplo anterior, como você definiria cada classe?
Classe Abstrata em Java52
A partir de agora, você não poderá instanciar
objetos Pessoa diretamente!
Revisando a classe abstrata53
Classe que não terá objetos instanciados
Quando não faz sentido criar objetos (ex: “Pessoa”)
Pode ser uma classe completa, incluindo atributos, operações e métodos
Oferece a base para uma hierarquia de classes
Oferece um conjunto de operações e métodos comuns a todas as subclasses (base para reutilização!!)
E se adicionarmos Professor...54
Podemos dizer que um Professor é uma Pessoa?
Claro, mas podemos afirmar também que:
Um Professor é um Funcionário
Professor na hierarquia de herança55
Valor inicial57
Redefinição de operações (override)59
Considere o seguinte:
Funcionários ganham 3% sobre o valor do salário bruto a cada triênio
Professores com Doutorado ganham 10% a mais sobre o valor calculado do triênio
Redefinição de operações (override)61
Permite chamar a implementação (método) da superclasse
A classe Funcionario63
...
... Alguma ideia para implementar?
Lembra do getIdade()?
Redefinição de operações (override)66
Uma subclasse pode: Adicionar atributos, operações e relacionamentos
Redefinir operações herdadas (com cuidado!)
A redefinição (ou overriding) ocorre quando um operação cuja assinatura já tenha sido especificada recebe um novo método (ou seja, uma nova implementação) em uma classe derivada (subclasse)
Redefinição de operações (override)67
A redefinição deve manter a mesma assinatura da operação original
Abre o olho!!!68
Entrar no ambiente Sophia
Baixar atividade 04
Ler (antes de perguntar!!) com atenção as orientações e segui-las passo a passo
Depois, vocês irão apresentar os resultados e discutir suas dúvidas!
Restringindo a redefinição em Java69
Por default, qualquer operação de uma classe X pode ser redefinida em quaisquer subclasses de X
Entretanto, a redefinição de uma operação pode ser evitada com o uso do modificador “final”
Restringindo a redefinição em Java70
No nosso exemplo, se a operação getTrienio() da superclasse Funcionario for declarada como final, você não poderá redefini-la na subclasse Professor
Modificador “final”71
Resumindo, quando você utiliza o modificador “final”, a operação não poderá ser redefinida pelas subclasses
Mas, este modificador também se aplica a atributos
Modificador “final”72
O modificador “final” também se aplica a atributos
Nossa política estabelece que todos os atributos sejam privados, lembra?
Modificador “final”73
Mas, quando utilizado em atributos, o modificador “final” permite a definição de constantes
Tipicamente, constantes em Java são descritas em caixa alta
Constantes em Java74
O modificador “final” pode ser usado para definir constantes em Java
Mas, Iremos dar preferência para definir constantes com o tipo enum
Tipo especial de classe que permite definir uma variável ou atributo como um conjunto de constantes predefinidas
Tipo “enum”75
A variável ou atributo deve ser igual a um dos valores que foram predefinidos para ela
Uma vez que elas são constantes, os nomes dos atributos de um enum devem estar em CAIXA ALTA
Declarando um tipo “enum”76
Você deve utilizar enum sempre que você precisar representar um conjunto fixo de constantes
Construtor para o tipo “enum”78
O construtor para um tipo enum deve ser privado ou package
Este construtor cria automaticamente as constantes que são definidas no início do corpo enum
Você não pode invocar diretamente um construtor enum
Operações abstratas83
Nós já vimos o conceito de classe abstrata
Não é possível instanciar objetos de uma classe abstrata
Mas, e operações abstratas...
Alguma ideia?
Uma operação abstrata é ...84
uma operação que não possui um método A implementação da operação (método) é delegada para as
subclasses
Mas, qual é a vantagem de ter uma operação sem método?
85Como você
implementaria a
operação
“desenhar()”
Note que a classe Figura é abstrata (representada em itálico na UML)
Da mesma forma, uma operação abstrata também é representada em itálico na UML
86
O que deve ser desenhado?
Tudo bem, eu não sei o que desenhar. Mas, ainda não entendi por que eu preciso desta
classe?
A ideia aqui é garantir
que todas as subclasses
de “Figura” sejam
obrigadas a fornecer
um método para
“desenhar()”
Classes e operações abstratas89
Nem toda classe abstrata precisa ter uma operação abstrata
Ex: classe “Pessoa”
Toda classe que tem, pelo menos, uma operação abstrata, deve ser abstrata
Polimorfismo93
Princípio pelo qual entidades de tipos diferentes podem ser acessadas através de uma única interface1
1. http://www.stroustrup.com/glossary.html#Gpolymorphism
Polimorfismo94
Diferente objetos “Retangulo” e “Circulo” podem ser acessados através da interface da classe “Figura”
r2
c2
r3
r1
desenhar()
FiguraPrograma usuário
Executa “desenhar()”
Executa “desenhar()”
c1
95“fig” aponta para um objeto “Retangulo”
“fig” agora aponta para um objeto “Circulo”
Note que o objeto “fig” assumiu mais de um tipoao longo da execução doprograma
96Este tipo de polimorfismo é conhecido como
“polimorfismo de inclusão”
O “Polimorfismo de Inclusão” é obtido a partir do relacionamento de generalização/especialização (herança).
Uma variável declarada como sendo do tipo da superclasse pode então assumir (referenciar) qualquer objeto que tenha sido criado a partir de suas subclasses.
A variável “fig” está limitada pela interface da classe “Figura”. Logo, você só poderá acessar as operações disponíveis em “Figura”!!
Você entendeu porque a operação “setAltura” não foi reconhecida pelo compilador?
ERRO!
E agora...Compila?
Typecasting(conversão de tipo)
O compilador reconhece a operação porque ela existe em “Retangulo”
Pronto! Agora compila, mas...
O erro agora será em tempo de execução!!
Você entende o porquê?
E se...
Agora compila e não há erro na execução!
Mas, perdemos a transparência do polimorfismo de inclusão!
Ligação1 (biding)103
Ligação prematura (early binding) ou ligação estática (static binding)
Quando o método a ser invocado é definido durante a compilação do programa
Ligação tardia (late binding) ou ligação dinâmica (dynamic binding)
Quando o método a ser invocado é definido somente em tempo de execução do programa
1. Existem autores que utilizam o termo “acomplamento” como tradução de “biding”
Ligação tardia104
O polimorfismo só pode ser aplicado se a linguagem de programação orientada a objetos suportar este mecanismo
Além de conhecida também como ligação dinâmica, pode ser ainda denominada ligação em tempo de execução (runtime biding)
Ligação tardia em Java105
Em Java, a ligação tardia é o comportamento padrão
Exceções:
Métodos “final” não podem ser redefinidos e o polimorfismo não se aplica
Métodos “private” são implicitamente declarados como “final”
Vamos trabalhar um pouco...106
Entrar no ambiente Sophia
Baixar atividade 05
Ler (você já conhece as regras!!) com atenção as orientações e segui-las passo a passo
Depois, vocês irão apresentar os resultados e discutir suas dúvidas!
Existem diferentes tipos de polimorfismo107
Inclusão
Polimorfismo
Ad-hoc(aparente)
Coerção
Paramétrico
Sobrecarga (overload)
Universal(verdadeiro)
(Cardelli e Wegner, 1985) http://lucacardelli.name/papers/onunderstanding.a4.pdf
Tipos de polimorfismo108
Polimorfismo universal ou verdadeiro
Quando uma operação ou tipo trabalha uniformemente para uma gama de tipos definidos na linguagem
Polimorfismo ad-hoc ou aparente
Quando uma operação ou tipo parece trabalhar para alguns tipos diferentes e pode se comportar de formas diferentes para cada tipo (ex: printf do C)
Polimorfismo paramétrico109
Classes paramétricas
Permitem que operações e classes operem sobre dados de diferentes tipos, sem que elas precisem ser reescritas para cada um dos tipos desejados
Uma operação polimórfica tem um parâmetro de tipo implícito ou explícito, o qual determina o tipo de argumento para cada aplicação daquela operação
110
Template de classe na UML
Objetos desta classe podem ser
declarados para diferentes tipos
(TipoItem) de modo uniforme: o
comportamento será sempre o
mesmo
Parâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”
111
Template de classe na UMLParâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”
...
<TipoItem> pode assumir
qualquer tipo, mas o
comportamento será sempre
o de uma Pilha!
...
Construtores
Você pode implementar vários construtores, mas eles precisam ter assinaturas diferentes!
O que é isso?
A superclasse java.lang.Object118
Base da hierarquia de classes do Java
Qualquer classe Java é uma subclasse (direta ou indireta) da classe Object
Portanto, qualquer classe que você utiliza ou implementa, herda atributos e operações da classe Object
http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
A superclasse java.lang.Object119
Você pode redefinir (override) os métodos das operações de Object
Lembre-se então que qualquer objeto instanciado será também um objeto Object
Voltaremos a discutir a classe Object em
aulas futuras
Criamos um vetor de objetos genéricos
(qualquer objeto criado a partir de qualquer
classe pode ser colocado neste vetor)
Forçamos então uma conversão (typecasting) para o tipo passado como parâmetro
Tiro curto!
Complete a
implementação
da classe Pilha,
usando Generics
Teste com uma pilha de Figuras...
A classe java.util.ArrayList123
Outras classes paramétricas em Java124
java.util.Vector<E> http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html
java.util.HashMap<K,V> http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
java.util.Stack<E> http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html
...
Sobrecarga (overload)125
Permite diferentes versões de uma mesma operação que aparenta funcionar com diferentes tipos
Os tipos não precisam possuir estrutura comum
A assinatura de cada versão da operação deve ser diferente
As versões das operações não têm relacionamento entre si
Classificada como polimorfismo ad-hoc (aparente) ou não verdadeiro
Sobrecarga (overload)126
Bastante utilizado para construtores
Permite instanciar um objeto de várias formas
Oportunidade para diferentes inicializações
Mas, pode ser utilizado com qualquer operação
Pode reduzir a legibilidade do código
Você lembra dos dois construtores que implementamos para a classe Pilha?
Coerção128
Conversão entre tipos diferentes, realizada automaticamente pelo compilador
Coerção129
Conversões implícitas do Java:
byte para short, int, long ou double
short para int, long, float ou double
char para int, long, float ou double
int para long, float ou double
long para float ou double
float para double
Coerção e Typecasting130
Coerção
Conversão implícita realizada pelo compilador
Typecasting
Conversão explícita realizada pelo programador
(tipo) variável
Revendo o conceito de Interface
Nós já vimos um conceito de Interface
A interface define o conjunto de operações visíveis (públicas) de uma classe
Define quais operações podem ser invocadas nos objetos de uma determinada classe
Este conceito também é chamado de “protocolo”
131
Revendo o conceito de Interface132
Até agora, a interface estava definida na própria classe
Porém, passaremos a considerar Interface como um mecanismo a parte
Uma Interface é uma especificação de comportamento (ou contrato) que implementadores concordam em implementar
Revendo o conceito de Interface133
Uma Interface é similar a uma classe abstrata, onde todas as operações são também abstratas:
Não pode ser instanciada, pois não possui implementação própria
Funciona como um contrato
A classe que implementa a Interface deve garantir que todas as operações da Interface tenham um método (o contrato deve ser respeitado)
134
Transformando Figura em uma Interface
Nos exemplos anteriores, a classe Figura havia sido definida
como uma classe abstrata que tinha apenas a operação
abstrata “desenhar()”
Revendo a implementação de “Retangulo”
Contratoaceito
Note que você não “herda” uma
Interface, mas você a “implementa”
Não seria necessário, pois não há herança
Mas, a partir do Java 6, @Override passou a ser
utilizado para indicar também implementação
Notação UML Circular (lollipop)
Tradução para “Realization”: a
Interface é implementada
pela Classe
Note que as classes
“Retangulo” e “Circulo” não
compartilham uma
estrutura comum (elas são
independentes uma da
outra)
E você pode ainda aplicar o polimorfismo de inclusão!!!
Notação UML para mostrar que a classe “Desenho” utiliza a interface “Figura”
Considerações sobre Interfaces142
Não têm construtores, uma vez que não podem ser instanciadas
Uma mesma interface pode estender uma ou mais interfaces
Uma mesma classe pode realizar (implementar) várias interfaces
Considerações sobre Interfaces143
Classes que realizam (implementam) uma mesma interface não precisam compartilhar uma estrutura comum
Uma interface especifica, usualmente, uma parte limitada do comportamento de uma classe
A realização (implementação) de uma ou mais classes não exclui a possibilidade de generalização (herança)
Considerações sobre Interfaces144
Reduz a dependência (acoplamento) entre classes, aumentando sua reusabilidade
Oferece uma alternativa simplificada para a implementação de herança múltipla
Exceção (Exception)145
É um evento que ocorre durante a execução de um programa e que interrompe o fluxo normal de instruções
Divisão por zero
Operação matemática inválida
Tentativa de acesso a uma posição inválida em um vetor
Tentativa de acesso a um objeto que não foi criado
etc.
Exceções em Java146
Quando um erro ocorre dentro de um método, o próprio método cria um objeto e o entrega para o ambiente de execução
Este comportamento é denominado disparar (“throwing”) uma exceção
O objeto criado é chamado de objeto de exceção e contem informação sobre o erro, incluindo seu tipo e o estado do programa quando o erro ocorreu
http://docs.oracle.com/javase/tutorial/essential/exceptions/
Exceções em Java
Depois que um método dispara (throws) uma exceção, o ambiente de execução tenta encontrar algum tratamento para tratá-la
A sequência de possíveis tratamentos para manipular a exceção é a pilha dos métodos que foram chamados para chegar até o método onde o erro ocorreu
147
148
main
Método com tratamento de exceção
Método sem tratamento de exceção
Método onde o erro ocorreu
Chamamétodo
Chamamétodo
Chamamétodo
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
149
main
Método com tratamento de exceção
Método sem tratamento de exceção
Método onde o erro ocorreuDispara (throws)
exceção
Propagaexceção
Trata (catches)a exceção
Procura portratamento implementado
Procura portratamento implementado
http://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
150
Java define 3 tipos de exceção
Checked
Unchecked
Checked Exception
Error
RuntimeException
Checked exception
Condições excepcionais que uma aplicação bem escrita deveria antecipar
A aplicação deve implementar ações para se recuperar destas condições (ex: usuário solicita a abertura de um arquivo inexistente)
Portanto, o tratamento de exceções é obrigatório para este tipo de exceção
151
Error (unchecked exception)
Condições excepcionais que são "externas" a uma aplicação que não podem ser antecipadas
Tipicamente, a aplicação não tem como se recuperar destas condições (ex: uma falha de hardware)
É possível implementar um tratamento para a exceção
152
Runtime exception (unchecked exception)
Condições excepcionais que são "internas" a uma aplicação que não podem ser antecipadas
Tipicamente, a aplicação não tem como se recuperar destas condições (ex: defeitos de programação)
É possível implementar um tratamento para a exceção, mas o correto seria eliminar o defeito que causou a exceção
153
Tratamento de exceções154
Permite que a execução do programa continue mesmo após a ocorrência de um erro
Aumenta a robustez do programa
Separa o código que define comportamento "normal" (esperado) do código que realiza tratamento de exceções
try...catch155
1. O código controlado pela cláusula try é executado
2. Se ocorrer uma exceção, o controle é desviado para o código dentro da cláusula catch
3. Se a exceção ocorrida estiver sendo considerada pela cláusula catch, o código de tratamento da exceção é executado (caso contrário, a exceção é repassada ao ambiente de execução)
4. Se não ocorrer uma exceção, o tratamento da exceção (catch) não é executado
try...catch156
Você pode adicionar quantas cláusulas catch forem necessárias
Permite tratamento específico para cada tipo de exceção considerado
objExcecao é o objeto de exceção criado quando a exceção ocorre
Ele possui várias informações sobre a exceção
try...catch157
Você pode considerar mais de uma exceção em uma mesma cláusula catch
try...finally
1. O código controlado pela cláusula try é executado
2. Se ocorrer uma exceção, o controle é desviado para o código dentro da cláusula finally que é executado
3. Se não ocorrer uma exceção, após o último comando dentro da cláusula try, o código dentro da cláusula finally é executado (ou seja, o código dentro da cláusula finally é sempre executado)
158
Combinando try...catch...finally159
Este bloco é executado
mesmo quando uma exceção ocorrer!!
Capturando todos os 3 tipos de exceção160
Capturando todos os 3 tipos de exceção161
Operação disponibilizada pelas classes de Exceção
Conhecendo as classes de exceção162
Classe Throwable http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html
Classe Exception http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html
Classe RuntimeException http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html
Classe Error http://docs.oracle.com/javase/7/docs/api/java/lang/Error.html
Experimente...163
A cláusula throws164
Permite especificar exceções que podem ser disparadas ou propagadas dentro de um determinado método
Você pode forçar (disparar) uma exceção dentro de um método, usando a cláusula throw
Você pode não desejar tratar a exceção no método atual e apenas propagá-la para o próximo método
O próximo método pode tratar a exceção ou continuar propagando
Forçando uma Exceção
Informa ao compilador que o método da operação
“geraExcecao()” deve, obrigatoriamente:
capturar (catch) a exceção Exception; ou
disparar (throw) uma exceção Exception
try-com-recursos (try-with-resources)170
Cláusula try (Java 7+) que declara um ou mais recursos
Um recurso é um objeto que deve ser fechado depois que o programa não precisar mais dele
Garante que cada recurso é fechado ao final da cláusula
Criando sua própria classe de exceção
Você pode ainda criar suas próprias exceções
Verifique se a plataforma Java já não oferece uma exceção que atenda às suas necessidades
... ou alguma exceção já criada por outros programadores e fornecedores
Verifique se a nova exceção será realmente útil
Utilize a palavra Exception ao final do nome da classe criada (boas práticas de codificação Java)
171
Vamos aprender a clonar objetos!
Se você não entendeu este slide, procure pela
ovelha Dolly na web
Formas para copiar objetos...
Shallow Copy Deep Copy
Lazy Copy
Precisa ser agora?!
Shallow copy
Para copiar o objeto A, o objeto B irá copiar todos os atributos de A
Se o valor do atributo é um objeto, B copiará o endereço de memória deste objeto (A e B apontarão para o mesmo objeto)
Se o valor do atributo é um tipo primitivo, B copiará o valor do tipo primitivo
Deep copy
Para copiar o objeto A, o objeto B irá copiar todos os atributos de A
Se o valor do atributo é um objeto, B copiará os dados deste objeto (A e B não compartilharão objetos)
A contrapartida em relação a uma shallow copy é o desempenho inferior
Se o valor do atributo é um tipo primitivo, B copiará o valor do tipo primitivo
Lazy copy
Combinação das estratégias Shallow e Deep copy
Inicialmente, objetos são copiados via shallow copy
Um contador é mantido para conhecer a quantidade de objetos copiados
Quando o programa tiver que modificar um objeto, ele verifica antes se aquele objeto compartilha dados
Se for o caso, uma deep copy é realizada e um novo objeto é criado antes dele ser modificado
...
...
Implementar a interface “Cloneable”
Suportar a exceção “CloneNotSupportedException”
...
...
Não esquecer de chamar o clone() da superclasse: garantir o efeito cascata
Usando a operação “clone”
Referências186
Grady Booch; Robert A. Maksimchuck; Michael W. Engle; BobbiJ. Young; Jim Conallen; Kelli A. Houston. Object-oriented analysisand design with applications. 3rd ed. Addison-Wesley, 2007.
Ricardo Pereira e Silva. UML 2 em Modelagem Orientada a Objetos. Visual Books, 2007.
Paul J. Deitel; Harvey M. Deitel. Java - Como Programar. 8ª ed., Prentice Hall, 2010.
OMG (Object Management Group), OMG Unified ModelingLanguage v2.5, 2012. http://www.omg.org/spec/UML/2.5/Beta1/PDF/
Referências187
Luca Cardelli; Peter Wegner. On understanding types, data abstraction and polymorphism. Computing Surveys, 17(4):471-522, December 1985.