POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)

Post on 18-Dec-2014

748 views 7 download

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.

Transcript of POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)

Prof. Marcello Thiry <marcello.thiry@gmail.com>

PROGRAMAÇÃO ORIENTADA A OBJETOS

Unidade 1 (parte 2)

3º período

marcello.thiry@gmail.com

2

marcello.thiry@gmail.com

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.

marcello.thiry@gmail.com

Você lembra...4

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

O que você pensou?6

E se fizermos

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Como funciona... 8

Endereço Valor

100 ??

101 ??

102 ??

103 ??

104 ??

105 ??

106 ??

... ...

umaPessoa

marcello.thiry@gmail.com

Como funciona... 9

Endereço Valor

100 ??

101 ??

102 ??

103 ??

104 ??

105 ??

106 ??

... ...

umaPessoa

marcello.thiry@gmail.com

Como funciona... 10

Endereço Valor

100 ??

101 ??

102 nome = “ ”......

103

...

200 ??

201 ??

... ...

umaPessoa

novo objeto Pessoa

102

marcello.thiry@gmail.com

Como funciona... 11

Endereço Valor

100 102

101 ??

102 nome = “ ”......

103

...

200 ??

201 ??

... ...

umaPessoa

novo objeto Pessoa

“Marcello”

marcello.thiry@gmail.com

Como funciona... 12

Endereço Valor

100 102

101 201

102 nome = “Marcello”......

103

...

200 ??

201 nome = “João”......

...

...

umaPessoa

outraPessoa

marcello.thiry@gmail.com

E se...13

O que você acha que irá acontecer?

Experimente imprimir o nome de umaPessoae outraPessoa e analisar o resultado...

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

E se tivéssemos algo como...15

Alguma ideia para implementar esta operação?

marcello.thiry@gmail.com

Aguarde um pouco mais, chegaremos

lá...

16

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

Vamos analisar...19

marcello.thiry@gmail.com

Vamos analisar...20

Você sentiu também!?

marcello.thiry@gmail.com

Duplicação de código...21

marcello.thiry@gmail.com

Ficou melhor?22

Mas, falta alguma coisa?

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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)

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Generalização / Especialização26

Sentido da generalização

Sentido da especialização

marcello.thiry@gmail.com

Níveis de abstração27

Abstraçãomais alta

Abstraçãomais baixa

marcello.thiry@gmail.com

Abstração e reusabilidade28

Maiorreusabilidade

Menorreusabilidade

marcello.thiry@gmail.com

Generalização em Java29

marcello.thiry@gmail.com

Generalização em Java30

marcello.thiry@gmail.com

Hora de reutilizar...31

Caiu a ficha?

marcello.thiry@gmail.com

O que essa figura tem a ver com herança?

32

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

34

A subclasse (CarroSubmarino)

herda de duas superclasses

(Carro e Submarino)

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

37

“Problema do diamante”

Você percebe a ambiguidade?

marcello.thiry@gmail.com

38Linguagens OO que implementam herança

múltipla devem fornecer soluções

para mitigar este problema

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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”

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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!!

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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...

marcello.thiry@gmail.com

49

O que você acha?

Faz sentido, criamos objetos Pessoa?

Qual a utilidade?

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

Classe Abstrata em UML51

Reparou que o nome da classe ficou em itálico?

marcello.thiry@gmail.com

Classe Abstrata em Java52

A partir de agora, você não poderá instanciar

objetos Pessoa diretamente!

marcello.thiry@gmail.com

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!!)

marcello.thiry@gmail.com

E se adicionarmos Professor...54

Podemos dizer que um Professor é uma Pessoa?

Claro, mas podemos afirmar também que:

Um Professor é um Funcionário

marcello.thiry@gmail.com

Professor na hierarquia de herança55

marcello.thiry@gmail.com

Vamos analisar um pouco mais...56

Veja o que você não entendeu e

pergunte...

marcello.thiry@gmail.com

Valor inicial57

marcello.thiry@gmail.com

?!?!?!?!58

Não tínhamos herdado isso

de Funcionario?

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Redefinição de operações (override)60

Na classe Professor...

e...

marcello.thiry@gmail.com

Redefinição de operações (override)61

Permite chamar a implementação (método) da superclasse

marcello.thiry@gmail.com

A classe Funcionario62

...

...

marcello.thiry@gmail.com

A classe Funcionario63

...

... Alguma ideia para implementar?

Lembra do getIdade()?

marcello.thiry@gmail.com

64Mas, você não pensou em simplesmente copiar o código, certo?

Certo!?

marcello.thiry@gmail.com

A classe Professor65

...

...

marcello.thiry@gmail.com

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)

marcello.thiry@gmail.com

Redefinição de operações (override)67

A redefinição deve manter a mesma assinatura da operação original

marcello.thiry@gmail.com

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!

marcello.thiry@gmail.com

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”

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Modificador “final”72

O modificador “final” também se aplica a atributos

Nossa política estabelece que todos os atributos sejam privados, lembra?

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Declarando um tipo “enum”76

Você deve utilizar enum sempre que você precisar representar um conjunto fixo de constantes

marcello.thiry@gmail.com

Como utilizar o tipo “enum”77

...

...

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Tipo “enum”79

...

marcello.thiry@gmail.com

Tipo “enum”80

...

marcello.thiry@gmail.com

Como utilizar o tipo “enum”81...

...

marcello.thiry@gmail.com

82Rapidinha!

Revise a implementação

anterior, utilizando o tipo “enum”

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

A ideia aqui é garantir

que todas as subclasses

de “Figura” sejam

obrigadas a fornecer

um método para

“desenhar()”

marcello.thiry@gmail.com

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Operações abstratas

são tipicamente

utilizadas com o

princípio de

polimorfismo!

marcello.thiry@gmail.com

91

Poli... o quê????

marcello.thiry@gmail.com

92Poli=Muitas

Morfhos=Formas

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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.

marcello.thiry@gmail.com

A variável “fig” está limitada pela interface da classe “Figura”. Logo, você só poderá acessar as operações disponíveis em “Figura”!!

marcello.thiry@gmail.com

Você entendeu porque a operação “setAltura” não foi reconhecida pelo compilador?

ERRO!

marcello.thiry@gmail.com

E agora...Compila?

Typecasting(conversão de tipo)

O compilador reconhece a operação porque ela existe em “Retangulo”

marcello.thiry@gmail.com

Você saberia explicar o motivo do erro de

compilação?

marcello.thiry@gmail.com

Pronto! Agora compila, mas...

O erro agora será em tempo de execução!!

Você entende o porquê?

marcello.thiry@gmail.com

E se...

Agora compila e não há erro na execução!

Mas, perdemos a transparência do polimorfismo de inclusão!

marcello.thiry@gmail.com

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”

marcello.thiry@gmail.com

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)

marcello.thiry@gmail.com

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”

marcello.thiry@gmail.com

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!

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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)

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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”

marcello.thiry@gmail.com

111

Template de classe na UMLParâmetro “Tipo” passado no momento da declaração de variáveis “Pilha”

marcello.thiry@gmail.com

...

Em Java, templates são

denominados tipos genéricos:

Generics

marcello.thiry@gmail.com

...

<TipoItem> pode assumir

qualquer tipo, mas o

comportamento será sempre

o de uma Pilha!

marcello.thiry@gmail.com

...

Construtores

Você pode implementar vários construtores, mas eles precisam ter assinaturas diferentes!

marcello.thiry@gmail.com

Chama o construtor

que aceita um “int”

como parâmetro

marcello.thiry@gmail.com

Operador ternário

(condicional)

marcello.thiry@gmail.com

O que é isso?

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Criamos um vetor de objetos genéricos

(qualquer objeto criado a partir de qualquer

classe pode ser colocado neste vetor)

marcello.thiry@gmail.com

Forçamos então uma conversão (typecasting) para o tipo passado como parâmetro

marcello.thiry@gmail.com

Tiro curto!

Complete a

implementação

da classe Pilha,

usando Generics

Teste com uma pilha de Figuras...

marcello.thiry@gmail.com

A classe java.util.ArrayList123

marcello.thiry@gmail.com

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

...

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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?

marcello.thiry@gmail.com

127

Outro exemplo...

marcello.thiry@gmail.com

Coerção128

Conversão entre tipos diferentes, realizada automaticamente pelo compilador

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Coerção e Typecasting130

Coerção

Conversão implícita realizada pelo compilador

Typecasting

Conversão explícita realizada pelo programador

(tipo) variável

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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)

marcello.thiry@gmail.com

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()”

marcello.thiry@gmail.com

Revendo a implementação de “Retangulo”

Contratoaceito

Note que você não “herda” uma

Interface, mas você a “implementa”

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Notação UML Circular (lollipop)

Relacionamento “Realization”

marcello.thiry@gmail.com

Notação UML Circular (lollipop)

Tradução para “Realization”: a

Interface é implementada

pela Classe

marcello.thiry@gmail.com

Note que as classes

“Retangulo” e “Circulo” não

compartilham uma

estrutura comum (elas são

independentes uma da

outra)

marcello.thiry@gmail.com

E você pode ainda aplicar o polimorfismo de inclusão!!!

marcello.thiry@gmail.com

Notação UML para mostrar que a classe “Desenho” utiliza a interface “Figura”

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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)

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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.

marcello.thiry@gmail.com

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/

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

150

Java define 3 tipos de exceção

Checked

Unchecked

Checked Exception

Error

RuntimeException

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

try...catch157

Você pode considerar mais de uma exceção em uma mesma cláusula catch

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Combinando try...catch...finally159

Este bloco é executado

mesmo quando uma exceção ocorrer!!

marcello.thiry@gmail.com

Capturando todos os 3 tipos de exceção160

marcello.thiry@gmail.com

Capturando todos os 3 tipos de exceção161

Operação disponibilizada pelas classes de Exceção

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

Experimente...163

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

165

Forçando uma Exceção

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

167

No exemplo anterior, devemos chamar a operação de modo seguro...

marcello.thiry@gmail.com

168

Outra opção seria capturarmos a exceção no próprio método da operação...

marcello.thiry@gmail.com

169

Ou ainda, simplesmente capturar e propagar a exceção para o próximo método...

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

172

marcello.thiry@gmail.com

173Dos “clones”, você acha

que eu tinha esquecido?

marcello.thiry@gmail.com

Vamos aprender a clonar objetos!

Se você não entendeu este slide, procure pela

ovelha Dolly na web

marcello.thiry@gmail.com

Formas para copiar objetos...

Shallow Copy Deep Copy

Lazy Copy

Precisa ser agora?!

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

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

marcello.thiry@gmail.com

...

...

marcello.thiry@gmail.com

...

...

Implementar a interface “Cloneable”

Suportar a exceção “CloneNotSupportedException”

marcello.thiry@gmail.com

...

...

Não esquecer de chamar o clone() da superclasse: garantir o efeito cascata

marcello.thiry@gmail.com

...

...

Deep copy

marcello.thiry@gmail.com

...

...

marcello.thiry@gmail.com

...

...

marcello.thiry@gmail.com

Usando a operação “clone”

marcello.thiry@gmail.com

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/

marcello.thiry@gmail.com

Referências187

Luca Cardelli; Peter Wegner. On understanding types, data abstraction and polymorphism. Computing Surveys, 17(4):471-522, December 1985.

marcello.thiry@gmail.com

marcello.thiry@gmail.com