programação orientada a objetos com javadanielc/cursos/pqts/java/java3.pdf · herança...

74
Programação Orientada a Objetos com Java Prof. Júlio Machado [email protected]

Upload: vantuong

Post on 09-Nov-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Programação Orientada a Objetos com Java

Prof. Júlio Machado

[email protected]

Page 2: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

HERANÇA

Page 3: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Herança é uma relação de generalização/especialização entre classes

• A ideia central de herança é que novas classes são criadas a partir de classes já existentes

– Superclasse: classe já existente

– Subclasse: classe criada a partir da superclasse

Page 4: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Diagrama de Classes UML

• Relacionamento de herança:

Page 5: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Herança cria uma estrutura hierárquica

• Ex.: uma hierarquia de classes para formas geométricas– Uma forma geométrica pode ser especializada em

dois tipos: bidimensional e tridimensional

especialização generalização

Page 6: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Como implementar herança em Java?

– Utiliza-se a palavra-chave extends para definir herança de classes

– Somente é possível herdar de uma única superclasse!

class Subclasse extends Superclasse {

...

}

Page 7: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Exemplo:

Não se repete adeclaração de atributose métodos herdados!

Page 8: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Exemplo:public class Produto{...}

public class ProdutoPerecivel extends

Produto{...}

Page 9: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Ao definir atributos da subclasse:

– Podemos herdar os atributos da superclasse

• Todos os atributos da superclasse são herdados automaticamente

– Ex.: atributos nome e preço de Produto

– Podemos definir novos atributos

• Evitar criar atributos com o mesmo nome de atributos herdados

– Ex.: atributo validade de ProdutoPerecivel

Page 10: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Exemplo:public class Produto{

private String nome;

private double preco;

public Produto(String n, double p){

nome = n;

preco = p;

}

...

}

Page 11: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Exemplo:public class ProdutoPerecivel extends Produto{

private Date validade;

public ProdutoPerecivel(String n, double p, int d, int m, int a){

nome = n;

preco = p;

GregorianCalendar cal = newGregorianCalendar(a,m,d);

validade = cal.getTime();

}

...

}

Não é a forma correta deInicializar os atributosherdados!

Page 12: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Subclasse tem acesso a todos os métodos públicos da superclasse

• Logo...

• Podemos utilizar o construtor da superclasse para inicializar os atributos herdados– Utiliza-se super()

• Deve ser o primeiro comando do construtor da subclasse!

• Sempre é utilizado!

Page 13: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Exemplo:public class ProdutoPerecivel extends Produto{

private Date validade;

public ProdutoPerecivel(String n, double p,

int d, int m, int a){

super(n,p);

GregorianCalendar cal = new

GregorianCalendar(a,m,d);

validade = cal.getTime();

}

...

}

Page 14: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Ao definir métodos da subclasse:– Podemos herdar os métodos da superclasse

• Os métodos são herdados automaticamente– Ex.: métodos getNome() e getPreco() de Produto

– Podemos definir novos métodos– Ex.: método getDataValidade() de ProdutoPerecivel

– Podemos sobrescrever métodos da superclasse!

Page 15: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança

• Modificadores de acesso:

– public: acessível em qualquer classe

– private: acessível somente dentro da própria classe

– protected: acessível dentro da própria classe ou de uma subclasse

Page 16: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Sobrescrita de Métodos

• Uma subclasse pode sobrescrever (“override”) métodos da superclasse

– Sobrescrita permite completar ou modificar um comportamento herdado

– Quando um método é referenciado em uma subclasse, a versão escrita para a subclasse é utilizada, ao invés do método na superclasse

– É possível acessar o método original da superclasse: super.nomeDoMetodo()

Page 17: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Sobrescrita de Métodos

• Um exemplo de sobrescrita são os métodos herdados da classe Object

– Em Java, todas as classes herdam diretamente ou indiretamente da classe Object

– Object é o topo da hierarquia de classes em Java

– Toda classe criada sem explicitar uma superclasse, herda implicitamente da superclasse Object

Page 18: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Sobrescrita de Métodos

• Alguns métodos herdados de Object:– String toString() retorna uma representação de

string do objeto• Usualmente utilizado para realizar a depuração de programas

• Também é chamado implicitamente quando um objeto é utilizado em um contexto que uma string era esperada

• Implementação original retorna o nome da classe e o código hashdo objeto

– boolean equals(Object outro) testa se o objeto possui o mesmo estado que outro objeto

• Estes métodos são usualmente sobrescritos se forem utilizados em uma subclasse!

Page 19: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Sobrescrita de Métodos

• A classe Produto pode sobrescrever o método toString()de Object:

public String toString(){

return super.toString()

+ "[nome=" + nome + ","

+ "preco=" + preco + "]";

}

Método herdado de Object

Page 20: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Sobrescrita de Métodos

• A classe ProdutoPerecivel pode sobrescrever o método toString()de Produto:

public String toString(){

return super.toString()

+ "[validade=" +

DateFormat.getDateInstance().format(valida

de) + "]";

}

Método herdado de Produto

Page 21: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Controle da Herança

• Modificador final

– Um método pode ser marcado como final para impedir que seja sobrescrito• public final void meuMetodo(){...}

– Uma classe pode ser marcada como final para impedir que possa ser estendida com subclasses• public final class MinhaClasse{...}

Page 22: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança e Polimorfismo

• “Polimorfismo é a característica única de linguagens orientadas a objetos que permite que diferentes objetos respondam a mesma mensagem cada um a sua maneira.”

Page 23: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança e Polimorfismo (Variáveis)

• A linguagem Java permite a utilização de variáveis com polimofismo

– Uma mesma variável permite referência a objetos de tipos diferentes

– Os tipos permitidos são de uma determinada classe e todas as suas subclasses

Page 24: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança e Polimorfismo (Variáveis)

• Exemplo:Produto p1 = new

ProdutoPerecivel(“a”,1.9,1,12,2011);

ProdutoPerecivel p2 = new Produto(“a”,1.9);

Produto psuper;

ProdutoPerecivel psub;

ProdutoPerecivel p3 = new

ProdutoPerecivel(“a”,1.9,1,12,2011);

psuper = p3;

psub = psuper;

psub = (ProdutoPerecivel) psuper;

correto

erro compilação

erro compilação

correto

correto

Page 25: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança e Polimorfismo (Variáveis)

• Java possui o operador instanceof que permitir verificar o tipo de uma instância– Retorna true se a expressão da esquerda é um objeto

que possui compatibilidade de atribuição com o tipo à sua direita

– Retorna false caso contrário

• Ex.:if (p1 instanceof Produto) {

...

}

Page 26: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança e Polimorfismo (Métodos)

• Em Java podemos utilizar métodos com polimorfismo

– Significa que uma mesma operação pode ser definida em diversas classes, cada uma implementando a operação de uma maneira própria

– Utiliza como base a sobrescrita de métodos

Page 27: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Herança e Polimorfismo (Métodos)

• Exemplo:

– Qual a saída no console?

Produto p = new ProdutoPerecivel(“a”,1.9,1,12,2011);

System.out.println(p);

Page 28: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Classes e Métodos Abstratos

• Em uma hierarquia de classe, quanto mais alta a classe na hierarquia, mais abstrata é sua definição– Uma classe no topo da hierarquia define o

comportamento e atributos que são comuns a todas as classes

– Em alguns casos, a classe nem precisa ser instanciada alguma vez e cumpre apenas o papel de ser um repositório de comportamentos e atributos em comum

Page 29: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Classes e Métodos Abstratos

• Classes abstratas são classes que não podem ser instanciadas

• São utilizadas apenas para permitir a derivação de novas classes

• Identificamos uma classe como abstrata pelo modificador abstract

public abstract class MinhaClasse{...}

• Em uma classe abstrata, um ou mais métodos podem ser declarados sem o código de implementação– São os métodos abstratos

Page 30: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Classes e Métodos Abstratos

• Métodos abstratos são métodos sem código de implementação– São prefixados pela palavra abstract

– Não apresentam um corpo. Sua declaração termina com “;” após a declaração dos parâmetros

public abstract void metodo(int p);

– Um método abstrato indica que a classe não implementa aquele método e que ele deve ser obrigatoriamente implementado nas classes derivadas, pois é um comportamento comum das subclasses

Page 31: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Classes e Métodos Abstratos

• Exemplo

Page 32: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Classes e Métodos Abstratos

• Exemplo:public abstract class FiguraBidimensional{

public FiguraBidimensional(int x, int y) {

centrox = x;

centroy = y;

}

public abstract double area();

...

}

Page 33: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Classes e Métodos Abstratos

• Exemplo:public class Circulo extends

FiguraBidimensional{

public Circulo(int x, int y, int r) {

super(x,y);

raio = r;

}

public double area(){

...

}

...

}

Page 34: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

INTERFACES

Page 35: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces

• Interfaces são estruturas que podem ser utilizadas para separar a especificação do comportamento de um objeto de sua implementação concreta– Trazem a especificação do conjunto de operações públicas sem código

de implementação

– Ao contrário das classes, define um novo tipo sem fornecer a implementação

• Dessa forma a interface age como um contrato, o qual define explicitamente quais métodos uma classe deve obrigatoriamente implementar

Page 36: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces

• Uma interface deve ser implementada por uma classe

– Uma interface pode ser implementada por diversas classes

• POLIMORFISMO!!!

– Uma classe pode implementar diversas interfaces

• Permite uma classes ser utilizada em diferentes contextos!!!

Page 37: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces

• Uma interface não pode ser instanciada

– Não se cria objetos a partir de uma interface

• Uma interface pode estender, via herança, outra interface

– Permite acrescentar novo comportamento a uma interface já existente

Page 38: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Diagrama de Classes UML

• Relacionamento de realização de interfaces:

Page 39: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces

• Uma interface em Java é essencialmente uma coleção de constantes, métodos abstratos e tipos (como enumeradores) declarados internamente– Métodos são sempre implicitamente publicabstract

– Atributos são sempre implicitamente publicstatic final

– Não é necessário repetir a declaração desses modificadores

Page 40: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces

• Definindo interfaces:

– Interfaces são implementadas através da palavra chave interface:

public interface MinhaInterface {

...

}

Page 41: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces

• Para utilizar uma interface:

– Implementa-se a mesma em uma classe

– Quando se declara que a classe implementa a interface, deve-se escrever o código para cada um dos métodos declarados nesta interface

public class MinhaClasse implements MinhaInterface {

//aqui vem a implementação dos métodos

}

Page 42: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces e Polimorfismo

• Usando Interfaces se pode trabalhar com polimorfismo

– Uma referência do tipo da Interface pode apontar para qualquer objeto que implementa aquela Interface

– Criando uma referência da Interface, é possível invocar os métodos definidos na Interface, de forma independente da classe do objeto utilizado

Page 43: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces e Polimorfismo

• Exemplo:

– Controlador de uma casa é capaz de controlar qualquer dispositivo que atenda as seguintes características

Page 44: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Interfaces e Polimorfismo

• Exemplo:

– Um objeto Lustre e Tv podem ser controlados por esse controlador pois implementam a interface necessária

Page 45: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Listas

• As operações disponíveis sobre listas estão definidas na interface List<E>

• A documentação da API de Java lista todas as operações permitidas sobre uma lista

Page 46: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Listas

• Duas implementações diferentes da interface List<E> são as classes ArrayList<E> e LinkedList<E>

– Implementações com performance diferente para operações diferentes

• Declaração:– Devemos informar o tipo dos elementos da lista ao

declararmos uma coleção (genéricos)– List<Tipo> umaLista = new ArrayList<Tipo>();

– List<Tipo> umaLista = new LinkedList<Tipo>();

Page 47: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Listas

Page 48: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Listas

Page 49: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• A ordenação é um método bastante utilizado.– Java fornece vários métodos já implementados para ordenar listas de

objetos• POLIMORFISMO!!!

– Ex.: classe Collections, método de classe sort(List<T>)List lista = new ArrayList();

...

Collections.sort(lista);

• Mas como?

• Os métodos de ordenação já estão prontos antes mesmo de definirmos que tipos de objetos vamos ordenar?

• Como os algoritmos de ordenação sabem que objeto1 <= objeto2 ?

Page 50: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• Alguns algoritmos de ordenação trabalham sobre objetos de classes que implementam a interface Comparable<T>– Essa interface especifica o método que os algoritmos

de ordenação utilizam para saber quando um objeto é menor, igual ou maior que outro

– Quando criamos uma nova classe, podemos implementar o método da interface Comparable<T>para podermos utilizar os algoritmos de ordenação de Java• Devemos implementar o método compareTo(objeto)

– O código de comparação fica isolado dos objetos que implementam a ordenação

Page 51: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• Como funciona:– Disponível na API Java

• public interface Comparable<T>– declara um método chamado compareTo(T), que deve ser

implementado por qualquer classe cujos objetos possam ser ordenados

• public class Collections– contem o método sort(List<T>), capaz de ordenar uma lista de

objetos. Para ordenar os objetos, este método chama o método compareTo()

– Criados pelo usuário• public class MinhaClasse implements

Comparable<MinhaClasse>– contem a implementação do método abstrato compareTo() que

compara dois objetos da classe

Page 52: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

public interface Comparable<T>{

//compareTo(T obj2)

//compara este objeto com outro

//Retorna :

// 0 se este objeto igual a obj2

// valor < 0 se este objeto menor que obj2

// valor > 0 se este objeto maior que obj2

int compareTo(T obj2);

}

Page 53: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

– Ex.: classe String• Esta classe já implementa a interface Comparable

• Logo é possível ordenar listas contendo strings

List<String> nomes = new ArrayList<String>();

nomes.add(“Julio Machado”);

nomes.add(“Isabel Manssour”);

nomes.add(“Bernardo Copstein”);

Collections.sort(nomes);

Page 54: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• Exemplo:

– Comparar pessoas pelo nome ou pela idade?

Page 55: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• Suponha que seja necessário ordenar uma lista de pessoas tanto pelo nome quanto pela idade

• Existe um segundo método de ordenação chamado sort(List, Comparator)– Este método ordena uma lista de acordo com os critérios

de ordenação fornecidos pelo objeto que implementa a interface Comparator<T>

Page 56: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• A interface Comparator<T> requer os seguintes métodos:

int compare(T o1, T o2)

boolean equals(Object obj)

• Quem implementa a interface não é mais o próprio objeto da ordenação!

Page 57: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Ordenação

• Exemplo:

– Dois comparadores diferentes, um para nome e outro para idade

Page 58: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Strategy

• Vantagens:

– Mostra como fornecer variações de um algoritmo

Page 59: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Strategy

• Contexto:

– Classe (context) se beneficia de diferentes implementações de um determinado algoritmo.

– Clientes desejam fornecer diferentes versões do algoritmo.

Page 60: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Strategy

• Solução:

– Define uma interface (strategy) que abstrai as operações do algoritmo.

– Classes “concretas” que fazem parte do padrão precisam implementar esta interface, cada qual com uma versão do algoritmo.

– Clientes passam instância de classe concreta para a classe de contexto.

– Sempre que um algoritmo precisa ser executado, a classe de contexto chama os métodos da interface.

Page 61: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Strategy

Page 62: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Strategy

Nome no Padrão Nome real (sorting)

Context Collections

Strategy Comparator

ConcreteStrategy classe que implementa Comparator

doWork() compare()

Page 63: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Operação típica sobre uma lista:

– Percorrer seus elementos em ordem, um de cada vez, e realizar uma operação sobre os elementos

Page 64: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Observe a implementação dessa operação

• O quê acontece em cada tipo de implementação diferente?

– Lista com arranjo

– Lista encadeada

for(int i=0; i<lista.size(); i++) {Object obj = lista.get(i);//faz algo com obj

}

Ineficiente!

Page 65: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Iterador

– Padrão de projeto de software que abstrai o processo de iteração sobre uma coleção de elementos

– Em Java é usualmente utilizado via comando fordo tipo “para-cada”

Page 66: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Observe a implementação dessa operação

Iterator it = lista.iterator();while(it.hasNext()) {

Object obj = it.next();//faz algo com obj

}

Page 67: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Um iterador (em Java) define três métodos:

– hasNext: testa se existe elementos remanescentes no iterador

– next: retorna o próximo elemento do iterador

– remove: remove o último elemento retornado

• Observação:

– O método remove usualmente não é implementado caso o iterador seja somente para percorrer a coleção

Page 68: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Java define uma interface para iteradores: Iterator

public interface Iterator<E> {// Returns true if the iteration has more elements.public boolean hasNext();// Returns the next element in the iteration. public E next();// Removes from the underlying collection the last// element returned by this iterator (optional). public void remove();

}– O método remove não faz muito sentido dentro do contexto, de

maneira que sua implementação normalmente prevê o lançamento da exceção UnsuportedOperationException.

Page 69: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• A implementação da interface Iteratornormalmente é feita a partir de uma classe interna

• Dessa forma evita-se quebrar o encapsulamento da classe

• Uma classe pode possuir diferentes tipos de iteradores

Page 70: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Estudo de Caso - Iteração

• Java define a interface Iterable de maneira que todas as coleções de Java tratam os iteradores da mesma maneira

public interface Iterable<T>{public Iterator<T> iterator();

}

• Desde o Java 6, o comando for (em sua versão “para-cada”) é capaz de iterar sobre qualquer coleção que implemente Iterable

Page 71: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Iterator

• Vantagens:– O iterator não expõe a estrutura interna da

coleção.

– O usuário da classe não necessita conhecimento de como percorrer a coleção.

– Simplifica a interface da classe.• Pense como seriam métodos para inserir ou remover

elementos em qualquer posição de uma lista encadeada...

Page 72: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Iterator

• Contexto:

– Um objeto (aggregate) contém outros objetos (elements)

– Clientes (métodos que usam o aggregate) precisam acessar os elementos

– O aggregate não deve expor a sua estrutura interna

– Podem existir múltiplos clientes que necessitam de acesso simultâneo

Page 73: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Iterator

• Solução:

– Criar uma classe iterator que busca um elemento por vez

– Cada iterator armazena a posição do próximo elemento a ser recuperado

– Caso existam múltiplas variações das classes aggregate e iterator, é melhor que elas implementem interfaces comuns (o cliente conhece apenas a interface)

Page 74: Programação Orientada a Objetos com Javadanielc/cursos/pqts/java/Java3.pdf · Herança •Herança cria uma estrutura hierárquica •Ex.: uma hierarquia de classes para formas

Padrão Iterator