Coleções e Visibilidade - Alessandro Cerqueira - 20/8/2007
Módulo VIII Coleções
Objetivo Apresentar as principais classes de coleção de Java Introduzir os conceitos de interface e realização
2
Coleções • Considere o seguinte exemplo:
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Departamento Sigla Nome
1
aloca
1..*
0..1 é gerenciado por 1
Empregado CPF Nome
• Ao codificarmos estas classes, precisamos decidir como iremos implementar os relacionamentos em Java. Para isto, será será necessá necessário colocar novos atributos nas classes. Estes novos atributos são chamados de Atributos Implí Implícitos. citos. • Regra Geral: – Para cada associaç associação ou agregaç agregação navegá navegável presente na classe, adicionamos um atributo implí implícito.
• Para relacionamentos uná unários colocamos um atributo cujo tipo deverá deverá ser “ponteiro para um objeto da classe XXX” XXX” • A grande questão é como são implementados os relacionamentos n-ários. rios. Uma primeira idé idéia é utilizarmos arrays para isto.
3
Coleções public class Departamento {
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
private String private String private Empregado[] private Empregado
sigla; nome; listaEmpregados; listaEmpregados; gerente;
public class { private private private
public Departamento(String sigla, String nome) { this.sigla this.sigla = sigla; this.nome this.nome = nome; this. this.listaEmpregados = new Empregado[100]; } public void addEmpregado(Empregado addEmpregado(Empregado novoEmp) novoEmp) { ... } public void removeEmpregado(Empregado removeEmpregado(Empregado exEmp) exEmp) { ... } } ...
Empregado String String Departamento
cpf; cpf; nome; depto;
public Empregado(String cpf, cpf, String nome, Departamento depto) { this. this.cpf = cpf; cpf; this.nome this.nome = nome; this. this.setDepto(depto); setDepto(depto); } public void setDepto(Departamento setDepto(Departamento depto) { ... } ...
}
• Nota: Observe que as duas associaç associações são navegá navegáveis a partir de Departamento, mas na classe Empregado somente a associaç associação “Aloca” Aloca” é navegá navegável; por isso é que temos somente um atributo implí implícito em Empregado, enquanto que em Departamento temos dois.
4
Exemplo
Relacionamentos Bidirecionais String “RH” RH”
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Departamento sigla: sigla:null nome: nome:null listaEmpregados: listaEmpregados: : null : listaEmpregados listaEmpregados gerente: gerente:null
Empregado
String “Recursos Humanos” Humanos”
“1234567812345678-90” 90”
String “José José ”
null 0
cpf: cpf: nome: depto:
String
1
2
null ...
99
Empregado
String “0987654309876543-21” 21”
cpf: cpf: nome: depto:
String “Maria” Maria”
5
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Métodos para Estabelecer Relacionamentos • Alé Além de colocarmos os atributos implí implícitos, necessitamos colocar mé métodos que estarão estabelecendo os relacionamento entre os objetos e, conseqü conseqüentemente, manipulando os atributos implí implícitos. • Caso o relacionamento seja uná unário (ou seja, se o atributo implí implícito não é uma coleç coleção), ão), deveremos colocar um método set___. set___. • Caso o relacionamento seja n-ário (ou seja, se o atributo implí implícito é uma coleç coleção), ão), deveremos colocar os métodos add___ e remove___. remove___. • A implementaç implementação destes mé métodos deve levar em conta se o relacionamento é unidirecional ou bidirecional.
6
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Métodos para Estabelecer Relacionamentos Bidirecionais NA CLASSE EMPREGADO public void setDepto( setDepto(Departamento depto) { // Se a referência para o departamento do Empregado é a mesma que // está está sendo recebida pelo parâmetro, não há há necessidade de atualizaç atualização if( ( this.depto .depto == depto) if this return; return; // Se o parâmetro é null, null, isto indica que o Empregado deve ser retirado // do departamento. if(depto if(depto == null) null) { Departamento antigo = this.depto; this.depto; // Apago a referência antiga this.depto this.depto = null; null; // Solicito ao Departamento para retirar sua referência para o Empregado Empregado antigo.removeEmpregado (this); antigo.removeEmpregado( this); } else { // Se o Empregado já já pertence a um Departamento, vou solicitar sua remoç remoção para // colocá colocá-lo em outro Departamento. if( ( this.depto if this.depto != null) null) this.depto. removeEmpregado( (this); this.depto.removeEmpregado this); // Estabeleç Estabeleço a referência this.depto this.depto = depto; // solicito ao Departamento para adicionar uma referência para o Empregado. depto. depto.addEmpregado( addEmpregado(this); this); } }
7
Métodos para Estabelecer Relacionamentos Bidirecionais
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
NA CLASSE DEPARTAMENTO
public void addEmpregado( addEmpregado(Empregado novoEmp) novoEmp) { // Se a referência para o Empregado já já está está presente na lista de // Empregados do Departamento, não há há necessidade de atualizaç atualização if( if(this. this.listaEmpregados. listaEmpregados.contains( contains(novoEmp)) novoEmp)) return; return; // Solicito ao objeto de coleç coleção referenciado por this. this.listaEmpregados // que adicione uma referência para o novo empregado this. this.listaEmpregados. listaEmpregados.add( add(novoEmp); novoEmp); // Solicito ao Empregado que referencie o seu novo departamento novoEmp. novoEmp.setDepto( setDepto(this); this); } public void removeEmpregado( removeEmpregado(Empregado exEmp) exEmp) { // Se a referência para o Empregado não está está presente na lista de // Empregados do Departamento, não há há necessidade de atualizaç atualização if( if( ! this. this.listaEmpregados. listaEmpregados.contains( contains(exEmp)) exEmp)) return; return; // Solicito ao objeto de coleç coleção referenciado por this. this.listaEmpregados // que remova a referência para o exex-empregado this. this.listaEmpregados. listaEmpregados.add( add(exEmp); exEmp); // Solicito ao Empregado que deixe de referenciar o departamento exEmp. exEmp.setDepto( setDepto(null); null); }
8
Exemplo Relacional
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• A idé idéia de adicionarmos atributos para a implementaç implementação de relacionamentos també também ocorre com o uso do modelo relacional atravé através do conceito de Chave Estrangeira. Estrangeira. • Lá, entretanto, não há há a diferenç diferença entre relacionamentos unidirecionais e bidirecionais. • Para descobrirmos dados entre as entidades relacionadas, nó nós necessitamos realizar operaç operações de JUNÇ JUNÇÃO. ÃO. DEPARTAMENTO
EMPREGADO
sigla
nome
gerente
cpf
nome
depto
JR
Jurídico
901-2
123-4
José
LG
LG
Logística
123-4
567-8
Maria
LG
901-2
Patrícia
JR
345-6
João
JR
9
Uma Forma de Execução da Junção
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
SELECT D.Nome, E.Nome (3º (3º- projeç projeção) FROM Departamento D, Empregado E (1º (1º- Prod.Cartesiano) Prod.Cartesiano) WHERE D.gerente = E.Cpf E.Cpf (2º (2º- Seleç Seleção)
D.sigla
D.nome D.gerente
E.cpf
E.nome
E.depto E.depto
JR
Jurídico
901-2
123-4
José
LG
JR
Jurídico
901-2
567-8
Maria
LG
JR
Jurídico
901-2
901-2
Patrícia
JR
JR
Jurídico
901-2
345-6
João
JR
LG
Logística
123-4
123-4
José
LG
LG
Logística
123-4
567-8
Maria
LG
LG
Logística
123-4
901-2
Patrícia
JR
LG
Logística
123-4
345-6
João
JR
10
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Coleções • A implementaç implementação de atributos n-ários com arrays não é adequada. (Arrays ou apresentam disperdí disperdício ou apresentam falta de posiç posições de memó memória). • Uma idé idéia melhor é utilizar a classe java. java.util. util.Vector. Vector. • Comparaç Comparação entre Array x Vector – Arrays • Tamanho fixo e definido na criaç criação do array. array. • Procura pelo índice. • Elementos do mesmo tipo. • Arrays de tipos primitivos ou de ponteiros para instâncias de uma classe especí específica. – Objetos Vector • O tamanho inicial é definido quando o vector é criado. Este pode ser modificado manualmente ou automaticamente. • Procura pelo índice ou conteú conteúdo. • Elementos de qualquer classe. • Vectors de ponteiros para instâncias de uma classe especí específica
11
Coleções
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
public class Departamento { private String private String private Vector private Empregado
sigla; nome; listaEmpregados; listaEmpregados; gerente;
public class { private private private
public Departamento(String sigla, String nome) { this.sigla this.sigla = sigla; this.nome this.nome = nome; this. this.listaEmpregados = new Vector( Vector( ); } public void addEmpregado(Empregado addEmpregado(Empregado novoEmp) novoEmp) { ... } public void removeEmpregado(Empregado removeEmpregado(Empregado exEmp) exEmp) { ... } } ... }
Empregado String String Departamento
cpf; cpf; nome; depto;
public Empregado(String cpf, cpf, String nome, Departamento depto) { this. this.cpf = cpf; cpf; this.nome this.nome = nome; this. this.setDepto(depto); setDepto(depto); } public void setDepto(Departamento setDepto(Departamento depto) { ... } ...
12
Exemplo com Vector
Relacionamentos Bidirecionais String “RH” RH”
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Departamento sigla: sigla:null nome: nome:null listaEmpregados: listaEmpregados: : null : listaEmpregados listaEmpregados gerente: gerente:null
String “Recursos Humanos” Humanos”
Empregado cpf: cpf: nome: depto:
String “1234567812345678-90” 90”
String “José José ”
Vector 0 1
Empregado
String “0987654309876543-21” 21”
cpf: cpf: nome: depto:
String “Maria” Maria”
13
Coleções
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Alguns mé métodos úteis da classe Vector: Vector: – Vector() :Cria uma nova instância sem elementos e com capacidade Vector(): inicial para 10 elementos. – Vector(int Vector(int capacidade): capacidade): Cria uma nova instância sem elementos e com capacidade inicial especificada pelo parâmetro. – Vector(int Vector(int capacidade, int fator): fator): Cria uma nova instância sem elementos e com capacidade inicial / fator de crescimento especificados pelos parâmetros. – add( add(Object elem) elem): adiciona um objeto no final do Vector. Vector. – add(int add(int índice, Object elem): adiciona um objeto na posiç posição especificada que deve estar entre 0 e o tamanho do Vector. Vector. – setElementAt( setElementAt(Object elem,int elem,int índice): ndice): coloca o objeto em determinada posiç posição, removendo o objeto que estiver lá lá anteriormente. – remove(Object remove(Object elem) elem): remove a primeira ocorrência do objeto no Vector. Vector. Retorna true caso tenha sido possí possível a remoç remoção. – remove (int índice): ndice): remove o objeto na posiç posição especificada. – size() size():: retorna o nú número de objetos presentes no Vector. Vector.
14
Coleções
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– – – – –
– –
–
get(int get(int índice): ndice): Retorna o objeto presente na posiç posição especificada. firstElement() firstElement():: Retorna o objeto presente na primeira posiç posição. lastElement() lastElement():: Retorna o objeto presente na última posiç posição. indexOf( indexOf(Object elem) elem): retorna o índice da primeira ocorrência do objeto no Vector ou -1 se o objeto não estiver presente. indexOf( indexOf(Object elem,int elem,int índice): ndice): retorna o índice da primeira ocorrência do objeto no Vector a partir da posiç posição especificada. Retorna 1 se o objeto estiver presente. lastIndexOf( lastIndexOf(Object elem) elem): retorna o índice da última ocorrência do objeto no Vector ou -1 se o objeto não estiver presente. lastIndexOf( lastIndexOf(Object elem,int elem,int índice): ndice): retorna o índice da última ocorrência do objeto no Vector a partir da posiç posição especificada. Retorna -1 se o objeto estiver presente. contains( contains(Object elem) elem): Informa se o objeto está está presente no Vector. Vector.
15 Legenda
Coleções no JDK 1.2
Interface
• Com o advento do jdk 1.2, 1.2, A classe Vector está está sendo evitada pois os seus mé métodos são synchronized (não permite acesso concorrente aos dados do Vector). Vector).
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• A estrutura das classes de coleç coleção (pacote java. java.util) util) está está colocada da seguinte forma:
Classe
Especializaç Especialização
Realizaç Realização
Collection
Object
Abstract Collection
List
Set
Abstract List SortedSet
Abstract Sequential List LinkedList
ArrayList
Vector
HashSet
TreeSet
16
Conceito de Interface • Em Java e na UML, uma Interface: – Se assemelha a uma classe abstrata
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Não apresenta atributos (somente constantes) – Não apresenta có código para os seus mé métodos* todos* – Possui somente as assinaturas dos mé métodos que deverão ser codificados pelas classes que implementarem a interface.* interface.* • Obs* - Se um mé método não apresenta có código é só possui a sua assinatura, então ele é um método abstrato. abstrato.
• Uma interface pode ser vista como a especificaç especificação de um serviç serviço que pode ser realizado por uma ou mais classes. • Geralmente optaopta-se por uma interface (e não por uma classe abstrata) quando não se sabe como implementar o serviç serviço ou quando o serviç serviço pode ser implementado de vá várias maneiras.
17
Conceito de Interface
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Realizaç Realização – Relacionamento definido na UML e em Java que indica que uma determinada classe irá irá realizar o serviç serviço especificado por uma interface. interface. Em Java costumamos popularmente chamar a realizaç realização de implementaç implementação. ão. – Realizar (ou implementar) implementar) uma interface significa que a classe deverá deverá implementar todos os mé métodos assinados na interface. interface. Se algum mé método ficar de fora, o compilador irá irá considerar a classe abstrata. abstrata. – Uma classe pode implementar quantas interfaces quiser. – O conceito de polimorfismo se aplica aos objetos de uma classe que implementam uma interface – Ex: public class HashSet implements Set { ... } Assim objetos HashSet també também podem ser vistos como objetos Set
Set <>
HashSet
18
Interface e Realização Exemplo
1..*
produz
1
Limpador
Fábrica
<>
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
limpar()
Limpador de Párara-brisa
LavaLava-Jato limpar()
LavaLava-Louç Louça
limpar()
Aspirador de Pó Pó limpar()
limpar()
LavaLava-Roupas limpar()
OBS: É melhor deixar Limpador como Interface pois esta apresenta todas as caracterí características de uma interface e assim estamos livres para deixar as classes que implementam implementam esta interface como especializaç especializações de uma outra classe (ex. Equipamento Elé Elétrico). LembreLembre-se que em Java uma classe só pode ser especializaç especialização direta de uma outra classe!
19
Interface e Realização
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Exemplo
• Objetos LavaLava-Jato, Jato, Aspirador de Pó Pó, Limpador de Pá Párara-Brisa, Brisa, LavaLavaRoupas e LavaLava-Louç Louça apresentam algumas propriedades em comum. Todas são equipamentos produzidos por uma fá fábrica e que realizam o serviç serviço de limpeza. limpeza. Suponha que a execuç execução da limpeza seja executada atravé através do mé método limpar(). limpar(). • Para caracterizar que estas classes são limpadores, poderí poderíamos criar uma classe abstrata chamada Limpador com uma associaç associação com Fábrica e apresentando o mé método limpar(). limpar(). • Entretanto, observe que a suposta classe Limpador não apresentaria atributos e seu único mé método é abstrato (a forma como cada classe irá irá implementar o mé método limpar() é diferente e não conseguimos produzir uma implementaç implementação que valha para todas as suas especializaç especializações).
20
Interface e Realização
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Exemplo
• Assim, é melhor caracterizar a classe Limpador como interface pois apresenta todas as caracterí características da mesma e, assim, permitimos que as suas realizaç realizações possam ser especializaç especializações de uma outra classe (lembre(lembre-se que em Java não há há heranç herança mú múltipla). • Contudo, observe que na realizaç realização há há a presenç presença da caracterí característica do polimorfismo; polimorfismo; pois os objetos Fábrica vêem os objetos LavaLava-Jato, Jato, Aspirador de Pó Pó, Limpador de Pá Párara-Brisa, Brisa, LavaLava-Roupas e LavaLava-Louç Louça como objetos da interface Limpador. Limpador.
21
Interface e Realização Exemplo (talvez um pouco mais lúdico) Pessoa
Chorador Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
<> chorar()
Polí Político chorar()
Carrasco
cpf nome endereç endereço
Aluno chorar()
<> torturar()
Professor torturar()
Terrorista torturar()
22
Codificando...
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
public interface Carrasco { public void torturar(); torturar(); } public class Aluno extends Pessoa implements Carrasco { ... public void torturar() torturar() { System. (“Se não estudar, vou te reprovar!!!! ”); System.out.println out.println( reprovar!!!!”
} ...
}
23
Coleções no JDK 1.2 • Interface Collection
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Uma collection representa um serviç serviço capaz de apontar para um conjunto de objetos que não estão necessariamente postos em uma ordem de posiç posição arbitrada pelo programador e que pode apresentar duplicaç duplicações. ões. – Métodos Importantes: Importantes: boolean add( add(Object o) void clear() clear() Iterator iterator() iterator()
boolean addAll( addAll(Collection c) boolean contains( contains(Object o) boolean remove( remove(Object o )
boolean removeAll( removeAll(Collection c)
int size() size()
• Classe Abstrata AbstractCollection – Superclasse de todas as coleç coleções. – É uma classe abstrata pois na realidade não implementa os métodos previstos na interface Collection. Collection.
24
Coleções no JDK 1.2
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Interface List – Especializaç Especialização de Collection; Collection; Uma lista representa um serviç serviço capaz de apontar para um conjunto de objetos que estão colocados em uma ordem de posiç posição arbitrada pelo programador e que pode apresentar duplicaç duplicação de elementos. elementos. – Assim, o programador determinar que elemento ficará ficará na posiç posição 0, na posiç posição 1, etc.
– Métodos Importantes: Importantes: Object get(int int indexOf( get(int posicao) posicao) indexOf(Object o) void add(int boolean contains( add(int posicao, posicao, Object o) contains(Object o) Object set(int set(int posicao, posicao, Object o) List subList(int subList(int inicio, int fim) Alé Além dos mé métodos de Collection
• Classe Abstrata AbstractList – Superclasse para as listas. – É uma classe abstrata pois não implementa os mé métodos da interface
25
Coleções do JDK 1.2 • Classe ArrayList – Implementaç Implementação (ou realizaç realização) da interface List. List.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Seu comportamento está está baseado em possuir um array de referências para Object que aponta para os elementos da lista. – Se o tamanho do array for insuficiente: • CriaCria-se um novo array com o tamanho maior; • CopiaCopia-se o conteú conteúdo do antigo array para o novo; • DescartaDescarta-se o antigo (sofrerá (sofrerá o Garbage Collection). Collection).
– Bom para recuperaç recuperação aleató aleatória por posiç posição; “Ruim” Ruim” para inserç inserção se realizar o redimensionamento do array a cada instante. – Para melhorar o desempenho, podemos utilizar o mé método ensureCapacity(tamanho) ensureCapacity(tamanho)
26
Coleções do JDK 1.2
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Classe LinkedList – Seu comportamento está baseado em implementar uma lista encadeada – Bom para inserção; “Ruim” para recuperação aleatória por posição já que há a necessidade de navegação pela lista. Entretanto, se a recuperação for iterativa (ou seja, posição a posição) não há problemas.
• Classe Vector – Comportamento igual ao do ArrayList porém o Vector é synchronized; ou seja, não permite acesso concorrente.
27
Coleções no JDK 1.2 • Interface Set
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Especializaç Especialização de Collection; Um set representa um serviç serviço capaz de apontar para um conjunto de objetos que não estão necessariamente colocados em uma ordem de posiç posição arbitrada pelo programador e que não permite a duplicaç duplicação de elementos. elementos.
– Métodos Importantes: Importantes: Os mesmos de Collection.
• Classe HashSet – Implementaç Implementação de Set. Para isto, utiliza internamente uma HashMap. HashMap. – Métodos Importantes: Importantes: HashSet(int HashSet(int capacidadeInicial) capacidadeInicial) HashSet(int HashSet(int capacidadeInicial, capacidadeInicial, float fatorDeCarga) fatorDeCarga)
28
Iterator
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Objeto que permite a recuperação seqüencial dos elementos de uma coleção. Collection colecao; colecao; ... for( ; it.hasNext (); ; ) for(Iterator it = colecao. colecao.iterator() iterator(); it.hasNext() { elemento = ( )it.next next() (); ; ()it. ... }
– Métodos Importantes: Importantes: boolean hasNext( hasNext( ) Informa se o iterator ainda pode retornar algum elemento Object next() next() Retorna o pró próximo elemento da iteraç iteração
29
Coleções no JDK 1.2 • Interface SortedSet
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Especializaç Especialização de Set; Um SortedSet representa um serviç serviço capaz de apontar para um conjunto de objetos sem duplicaç duplicações cujos elementos estão dispostos ordenadamente segundo algum crité critério especificado. – Para viabilizar a ordenaç ordenação, é necessá necessário que o SortedSet saiba o crité critério para ordenaç ordenação. ão. Para especificaç especificação do crité critério, devemos fazer com que os elementos do SortedSet implementem a interface Comparable ou passarmos para o SortedSet um objeto que implemente a interface
Comparator. Comparator.
– Métodos Importantes: Importantes: Os mesmos de Set.
• Classe TreeSet – Implementa um SortedSet cuja complexidade de ordenaç ordenação é Log(n) Log(n)
– Métodos Importantes: Importantes: TreeSet( TreeSet( ) Os elementos deverão implementar Comparable TreeSet( TreeSet(Comparator comparador) Utiliza um comparador para estabelecer a ordem
30
Comparable
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Se ao criar um TreeSet não indicamos um Comparator, Comparator, ele considerará considerará que as classes de seus elementos implementam a interface Comparable. Comparable.
– Interface Comparable • int compareTo(Object o) – Se o objeto que receber a mensagem (this (this)) é igual ao objeto recebido como parâmetro, então o mé método deve retornar 0 (Zero) – Se o objeto que receber a mensagem (this (this)) vem primeiro que o objeto recebido como parâmetro, então o mé método deve retornar um número negativo. negativo. – Se o objeto que receber a mensagem (this) this) vem depois que o objeto recebido como parâmetro, então o mé método deve retornar um número positivo. positivo.
31
Comparable • Exemplo de Comparação com Strings Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
public class Empregado implements Comparable { private String nome; nome; ... public int compareTo( compareTo(Object o) { if(o if(o instanceof Empregado) Empregado) { Empregado e = (Empregado)o (Empregado)o; return this. this.nome. nome.compareTo( compareTo(e.nome); nome); } return –1; } } A classe String també também é uma realizaç realização de Comparable! Comparable!
32
Comparable • Exemplo de Comparação Numérica public class Empregado implements Comparable Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
{ private int idade; idade; ... public int compareTo( compareTo(Object o) { if( if(o instanceof Empregado) Empregado) { Empregado e = (Empregado)o (Empregado)o; return this. this.idade - e.idade; idade; } return –1; } }
33
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Erros Vinculados à implementação do Comparable • Se em uma classe colocarmos a indicação “implements Comparable” mas não adicionarmos o método “compareTo”, o compilador acusará erro. • Da mesma forma, não adianta colocar o método “compareTo” e não colocarmos a indicação “implements Comparable”, pois quando o TreeSet utiliza o critério do Comparable, ele só permite que sejam adicionados Objetos que sejam Comparable. Assim, este erro só será percebido em tempo de execução.
34
Comparator
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Se ao criar um TreeSet passamos um Comparator, Comparator, este determinará determinará a ordem dos elementos utilizando o mé método compare. compare.
– Interface Comparator • int compare(Object o1, Object o2) – Se o objeto que receber a mensagem (this (this)) é igual ao objeto recebido como parâmetro, então o mé método deve retornar 0 (Zero) – Se o objeto que receber a mensagem (this (this)) vem primeiro que o objeto recebido como parâmetro, então o mé método deve retornar um número negativo. negativo. – Se o objeto que receber a mensagem (this) this) vem depois que o objeto recebido como parâmetro, então o mé método deve retornar um número positivo. positivo.
35
Comparator • Exemplo de Comparator public class ComparadorPorNome implements Comparator Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
{ public int compare(Object compare(Object o1, o1, Object o2) o2) { if(o1 if(o1 instanceof Empregado && o2 instanceof Empregado) { Empregado e1 = (Empregado)o1 ; (Empregado)o1; Empregado e2 = (Empregado)o2 ; (Empregado)o2; return e1.getNome (). .compareTo( ()); ); e1.getNome() compareTo(e2.getNome e2.getNome() } return –1; } }
36
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Operador instanceof • Se quisermos testar um atributo ou variá variável local declarado como ponteiro para um objeto de uma superclasse está está propriamente apontando para um objeto de uma de suas subclasses, subclasses, devemos utilizar o operador instanceof. instanceof. // Elemento foi declarado como ponteiro para um // objeto da classe Object Object elemento = coleç (posiç ção); coleção.get ão.get(posi // Para sabermos se elemento na realidade está está apontando // para um objeto da classe String (subclasse), devemos // utilizar o operador instanceof if(elemento if(elemento instanceof String) { ... }
37
Casting e instanceof • Observe que nos có códigos exibidos temos a presenç presença da seguinte linha: Empregado e = (Empregado)o (Empregado)o; Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Por que há há a necessidade de colocarmos (Empregado)? • Java é uma linguagem fortemente tipada! tipada! – Há intensa verificaç verificação dos tipos feita pelo compilador nas operaç operações que codificamos. – No caso de atribuiç atribuições, o compilador verificará verificará se o tipo à direita é igual ou compatí compatível com o tipo à esquerda • Ex: int a = false; ) não é igual nem false;// O tipo à direita (boolean (boolean) // compatí compatível com o tipo à esquerda (int)
– A verificaç verificação també também é feita na passagem de parâmetros (o tipo do parâmetro deve ser igual ou compatí compatível com o especificado no método). todo).
• Observe que no có código, o tipo de o (elemento à direita) é “ponteiro para um objeto da classe Object” Object” e o tipo de e (elemento à esquerda) é “ponteiro para um objeto da classe Empregado” Empregado”.
38
Casting e instanceof
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
•
Neste caso, o tipo à direita não é igual nem compatí compatível com o tipo à esquerda (nem sempre um ponteiro para Object está está apontando para um Empregado). (Continuaçção) (Continua
• Mas, por causa do teste realizado previamente com o instanceof, instanceof, sabemos que o (ponteiro para Object) Object) aponta para um objeto Empregado. Empregado. • Para o compilador não reclamar da operaç operação (Type (Type Mismatch – tipo incompatí incompatível), vel), devemos solicitar que ele veja somente neste instante o ponteiro para Object como ponteiro para Empregado. Empregado. A esta operaç operação denominamos de casting. casting. • Se por acaso o não estivesse apontando para um Empregado, a JVM lanç lançaria uma exceç exceção chamada ClassCastException que abortaria a execuç execução do programa.
39
Casting e instanceof •
Sempre precisaremos de indicar um casting na recuperaç recuperação de elementos, pois todos os mé métodos de recuperaç recuperação foram codificados para retornar uma referência para Object. Poré Porém, na maioria das vezes, sabemos que eles pertencem a uma especializaç especialização de Object.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Observe o seguinte caso: String str = coleç (posiçção); coleção.get ão.get(posi ptr para String •
ptr para Object
O compilador irá irá acusar erro pois o tipo à direita não é igual nem compatí compatível com o tipo à esquerda. Mas se soubermos que Coleç (posiçção) sempre retornará Coleção.get ão.get(posi retornará uma String, devemos avisar isto para o compilador atravé através de um Casting. Casting.
String str = (String) coleç (posiçção); coleção.get ão.get(posi
• Dica para o uso do casting em atribuições – Se o tipo da direita não é igual ou compatí compatível com o tipo da esquerda, deveremos utilizar o Casting. Casting.
40
Coleções
Implementando Classes de Associação
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
• Devemos substituir a modelagem proposta pela implementaç implementação de duas associaç associações ligando a classe de associaç associação com as classes envolvidas no relacionamento. • No exemplo abaixo, apesar de termos modelado a associaç associação “Envolve a Venda de” de”, vamos substituisubstitui-la pelas associaç associações em vermelho. Observe que as cardinalidades das extremidades são uná unárias e que as cardinalidades na classe de associaç associação são trocadas em relaç relação ao que existia antes (em azul). azul). Nota Fiscal
0..* Envolve a Venda de 1..*
Produto CódBarras Nome
Número Data
Item
1 1..*
NumItens PreçoUnitário
1 0..*
41
Classe Collections • É uma classe que conté contém vá vários mé métodos está estáticos que fazem a manipulaç manipulação dos objetos de coleç coleção.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Métodos Importantes: Importantes: static static static static static static static static
void copy( copy(List l1, List l2) void reverse( reverse(List l) void sort( sort(List l) void sort( sort(List l, Comparator cmp) Collection unmodifiableCollection( unmodifiableCollection(Collection c) List unmodifiableList( unmodifiableList(List c) Collection synchronizedCollection( synchronizedCollection(Collection c) List synchronizedList( synchronizedList(List c)
Exemplo: ArrayList lista = new ArrayList(); ArrayList(); ... Collections. Promover á a ordenaç ordenação da lista atravé atrav és de Comparable Comparable´ ´s Collections.sort(lista); sort(lista); // Promoverá
• Coleç Coleções Synchronized – São aquelas que só só podem ser manipuladas por uma única Thread a cada instante. A única exceç exceção é a recuperaç recuperação via iterator. iterator.
42
Coleções no JDK 1.2 • Classe Hashtable
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
– Não está está vinculada a interface Collection (implementa na realidade a interface Map) Map) – Funciona como uma tabela Hash. Hash. Para adicionarmos um elemento, temos que vincular a ele uma chave de indexaç indexação que é utilizada para a recuperaç recuperação. • public void put( put(Object chave, Object elemento) – Insere um elemento no Hashtable indexandoindexando-o pela chave passada.
• public Object get( get(Object chave)
Map
Dictionary
– Recupera o elemento indexado no Hashtable pela chave fornecida.
– A posiç posição de um elemento é determinada por sua funç função hash. hash. Em Java, todo objeto possui o mé método Hashtable hashCode() e este é utilizado como funç função hash. hash. – Como Hashtable é synchronized, é melhor utilizar a classe HashMap. HashMap.
HashMap
43
Hashtable Exemplo
• Se enviarmos a mensagem get( get(“1234567812345678-90” 90”) para o Hashtable, Hashtable, ele nos dará dará uma referência para o objeto Empregado “José” José”.. Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Hashtable tabela:
Empregado cpf: cpf: nome: depto:
String “1234567812345678-90” 90”
String “José José ”
Chaves
Objetos
String “12345678 12345678--90 90””
String “09876543 09876543--21 21””
Empregado cpf: cpf: nome: depto:
String “0987654309876543-21” 21”
String “Maria” Maria”
44
Coleções no JDK 1.2 – Outros Métodos Importantes de Hashtable: Hashtable() Hashtable() Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007 Cole
Hashtable(int Hashtable(int capacidadeInicial) capacidadeInicial) Hashtable(int Hashtable(int capacidadeInicial, capacidadeInicial, float fatorDeCarga) fatorDeCarga) boolean containsValue( containsValue(Object o) boolean containsKey( containsKey(Object o) Set keySet() keySet() Collection values() values() Object remove( remove(Object key)
– Hashtable é uma classe synchronized. Prefira a classe HashMap.