Você está na página 1de 8

Implementa

Implementao de Gen
Genricos,
Iteradores

Isabel Harb Manssour


Porto Alegre,
Alegre, maio de 2006

Roteiro


Implementa
Implementao de Gen
Genricos




Colees
Conceito de Genrico
Implementao

Iteradores




Conceito
Utilizao
ForEach

PS: Material adaptado das aulas do Prof. Bernardo Copstein

Colees


Java disponibiliza classes e interfaces que


facilitam o agrupamento e processamento de
objetos em conjuntos



Colees (Java Collections Framework)


Estruturas de dados + algoritmos para sua
manipulao

Java Collections framework




Arquitetura unificada para representar e


manipular colees, de forma independente dos
detalhes de sua representao

Colees


O programador simplesmente utiliza as


estruturas de dados sem se preocupar com
a maneira como so implementadas

Vantagens


Reutilizao de cdigo (implementao mais


rpida)
Desempenho superior



Maior velocidade de execuo


Menos memria

Colees


Colees





De forma simplificada, so objetos capazes de


armazenar conjuntos de referncias para outros
objetos
Correspondem a classes oferecidas na
biblioteca padro de Java
Trabalham com polimorfismo
So implementadas com genricos

Colees


Classes e interfaces que compreendem a


estrutura de colees esto no pacote java.util

Java separa a representao da coleo em:




Interfaces


Definem mtodos que podem ser usados para


manipulao dos objetos nas colees

Implementaes


Classes que implementam as interfaces, mas,


internamente, manipulam os dados de forma diferente

Colees


Exemplo de colees


LinkedList, ArrayList, Vector, ...

Exemplo de utilizao

ArrayList vetor = new ArrayList();


Cliente c1=new Cliente("Fulano","End1","1111222/22",10,5,1970);
Cliente c2=new Cliente("Beltrano","End2","3181902/71",21,10,1988);
Cliente c3=new Cliente("Ciclano","End1","5819162/02",4,8,1965);
vetor.add(c1);
vetor.add(c2);
vetor.add(c3);
for (int i=0; i<vetor.size(); i++) {
System.out.println( ((Cliente)vetor.get(i)).getNome() );
}

Conceito de Genrico


No exemplo anterior, quando se recupera


um elemento de uma coleo, necessrio
colocar um cast



Inconveniente
Inseguro (o compilador no testa o cast, que
pode gerar erro durante a execuo do
programa)

for (int i=0; i<vetor.size(); i++) {


System.out.println( ((Cliente)vetor.get(i)).getNome() );
}

Conceito de Genrico


Uma das principais modificaes do Java


1.5 so os tipos genricos
Genricos nos permitem criar abstraes
sobre tipos de dados
Usando genricos evita-se escrever cdigo
maante e, em especial, potenciais erros de
execuo resultante do uso excessivo de
conversores de tipo (casts)

Conceito de Genrico


Genricos


Fornecem uma maneira de comunicar o tipo de


uma coleo ao compilador

Quando o compilador conhece o tipo do


elemento da coleo, ele pode verificar se a
mesma est sendo usada corretamente e pode
inserir os casts corretos nos valores
recuperados da coleo

Verificao em tempo de compilao

Implementao
Exemplo de implementao de um genrico simples:

import java.util.*;
public class Lista<E> {
private ArrayList<E> lista;
public Lista(){ lista = new ArrayList<E>(); }
public void add(E elemento){ lista.add(elemento); }
}
public class TestaListaGenericaSimples{
public static void main(String args[]){
Lista<Cliente> lp = new Lista<Cliente>();
lp.add(new new Cliente("Fulano","End1","1111222/22",10,5,1970));
lp.add(new Cliente("Beltrano","End2","3181902/71",21,10,1988));
lp.add(new Cliente("Ciclano","End1","5819162/02",4,8,1965));
}
}

Implementao


Conveno


Usam-se letras maisculas individuais para


especificar parmetros de tipo. Tipicamente:




<E> element (elemento de uma coleo)


<T> type (tipo)
Outras letras prximas a T

Herana


Se Aluno subclasse de Pessoa, isso no


significa que Lista<Aluno> seja subclasse de
Lista<Pessoa>

Implementao


Restries sobre genricos




possvel criar genricos limitados a uma certa


familia de classes
Exemplo: public class Lista<E extends Produto>{
...
}

O exemplo define uma classe Lista que pode


conter quaisquer elementos cujo tipo seja um
subtipo de Produto (subclasse ou implementao)
Este tipo de restrio chamado de limte
superior (upper bounds)
No importando se Produto uma classe ou
interface usa-se a palavra reservada extends

Implementao


Restries sobre genricos




possvel criar tambm restries de limite


inferior (lower bounds) que so de utilizao mais
rara
Exemplo: public class Lista<E super Enlatado>{
...
}

O exemplo apresenta uma lista cujos elementos


devem ser supertipos de Enlatado
Por exemplo, se Enlatado derivado de Produto,
ento Produto um tipo de elemento aceito na
coleo

Implementao


Java no cria um tipo especfico para cada


instanciamento de uma estrutura genrica
Durante a compilao as anotaes entre
< e > so apagadas e ocorre uma
traduo para cdigo Java tradicional com
os casts adequados.

Roteiro


Implementao de Genricos




Colees
Conceito de Genrico
Implementao

Iteradores




Conceito
Utilizao
ForEach

Conceito


Quando se trabalha com colees, surge a


necessidade de manipular os objetos um a
um

Neste caso, utiliza-se um mecanismo de


iterao



Definido pela interface Iterator


A partir de uma instncia da classe que
representa a coleo, cria uma maneira de
visualizar os objetos contidos na coleo

Conceito


Um iterador um padro de projeto de


software que abstrai o processo de busca
sobre uma coleo de elementos
Consiste de:




Uma seqncia S
Uma posio corrente sobre S
Uma forma de avanar para a prxima posio
em S, tornando-a posio corrente

Utilizao


A interface Iterator declara trs mtodos de


interesse


boolean hasNext(): retorna true se a lista de

iterao ainda contm elementos


Object next(): retorna o prximo objeto da lista
de iterao
void remove(): no recebe argumentos e remove
o ltimo elemento retornado pela coleo que foi
usada para a sua criao

Utilizao


Pode-se obter uma instncia de classe que


implementa a interface Iterator usando o
mtodo iterator() da coleo
Resumindo Iterators



Provm uma forma nica de se acessar uma coleo


Definido em um dado momento sobre uma coleo,
permite navegar (atravs de uma instncia) de forma
padro sobre aquela coleo independente da
estrutura interna da mesma
As classes de colees, em geral, possuem um
mtodo chamado iterator() que devolve uma referncia
para um objeto da classe Iterator

Utilizao


Exemplo:

LinkedList<Cliente> l = new LinkedList<Cliente>();


l.add(new Cliente("Fulano","End1","1111222/22",10,5,1970));
l.add(new Cliente("Beltrano","End2","3181902/71",21,10,1988));
l.add(new Cliente("Ciclano","End1","5819162/02",4,8,1965));
Cliente c;

ListIterator<Cliente> iterator = l.listIterator();


while ( iterator.hasNext() ) {
c = iterator.next(); // pega o elemento
System.out.println(c.toString());
}

ForEach




Nova sintaxe do comando for


Facilita a iterao sobre vetores e colees
Funciona sobre qualquer coleo que
implemente a interface Iterable
public interface Iterable<T>{
Iterator<T> iterator();
}

Esta interface define um mtodo que retorna


um iterador sobre a coleo


uma interface genrica.

ForEach


Exemplo:

LinkedList<Cliente> l = new LinkedList<Cliente>();


l.add(new Cliente("Fulano","End1","1111222/22",10,5,1970));
l.add(new Cliente("Beltrano","End2","3181902/71",21,10,1988));
l.add(new Cliente("Ciclano","End1","5819162/02",4,8,1965));
Cliente c;

L-se: para c em l

for ( Cliente c : l ) {
System.out.println(c.toString());
}

Referncias


HORSTMANN, Cay S. Big Java. Porto Alegre:


Bookman, 2004. 1125 p.

GOODRICH, M. TAMASIA, R. Estrutura de


dados e algoritmos em Java. Ed. Bookman,
2002.

GOODRICH, M. TAMASIA, R. Data structures


and algorithms in Java. Ed. IE Wiley, 2005, 4a
ed.