Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 Módulo Módulo ColeçõesColeções C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - Objetivo Apresentar as principais classes de coleção de Java Introduzir os conceitos de interface e realização 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 2 ColeçõesColeções •• Considere o seguinte exemplo:Considere o seguinte exemplo: •• Ao codificarmos estas classes, precisamos decidir como iremos Ao codificarmos estas classes, precisamos decidir como iremos Departamento Empregado 1 aloca � 1..* 0..1 é gerenciado por � 1Sigla Nome CPF Nome C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• Ao codificarmos estas classes, precisamos decidir como iremos Ao codificarmos estas classes, precisamos decidir como iremos implementar os relacionamentos em Java. Para isto, será necessário implementar os relacionamentos em Java. Para isto, será necessário colocar novos atributos nas classes. Estes novos atributos são colocar novos atributos nas classes. Estes novos atributos são chamados de chamados de Atributos de RelacionamentoAtributos de Relacionamento ou ou Atributos ImplícitosAtributos Implícitos.. •• Regra Geral:Regra Geral: –– Para cada Para cada associaçãoassociação ou ou agregaçãoagregação navegávelnavegável presente na classe, presente na classe, adicionamos um atributo de relacionamento.adicionamos um atributo de relacionamento. •• Para relacionamentos Para relacionamentos unáriosunários colocamos um atributo cujo tipo deverá colocamos um atributo cujo tipo deverá ser “ser “ponteiro para um objeto da classe XXXponteiro para um objeto da classe XXX”” •• A grande questão é como são implementados os relacionamentos A grande questão é como são implementados os relacionamentos nn--áriosários. Uma primeira idéia é utilizarmos . Uma primeira idéia é utilizarmos arraysarrays para isto.para isto. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 3 ColeçõesColeções public class Departamentopublic class Departamento {{ private Stringprivate String sigla;sigla; private Stringprivate String nome;nome; private Empregado[] private Empregado[] listaEmpregados;listaEmpregados; private Empregado private Empregado gerente;gerente; public Departamento(String sigla, String nome)public Departamento(String sigla, String nome) {{ this.sigla = sigla;this.sigla = sigla; this.nome = nome;this.nome = nome; public class Empregadopublic class Empregado {{ private Stringprivate String cpf;cpf; private Stringprivate String nome;nome; private Departamento depto;private Departamento depto; public Empregado(String cpf, String nome, public Empregado(String cpf, String nome, Departamento depto)Departamento depto) {{ this.cpf = cpf;this.cpf = cpf; this.nome = nome;this.nome = nome; C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - this.nome = nome;this.nome = nome; this.listaEmpregados = new Empregado[100];this.listaEmpregados = new Empregado[100]; }} public void addEmpregado(Empregado novoEmp)public void addEmpregado(Empregado novoEmp) {{ ...... }} public void removeEmpregado(Empregado exEmp)public void removeEmpregado(Empregado exEmp) {{ ...... }} ...... }} this.nome = nome;this.nome = nome; this.setDepto(depto);this.setDepto(depto); }} public void setDepto(Departamento depto)public void setDepto(Departamento depto) {{ ...... }} ...... }} •• Nota:Nota: Observe que as duas associações são navegáveis a partir de Departamento, mas na Observe que as duas associações são navegáveis a partir de Departamento, mas na classe Empregado somente a associação “Aloca” é navegável; por isso é que temos somente classe Empregado somente a associação “Aloca” é navegável; por isso é que temos somente um atributo de relacionamento em Empregado, enquanto que em Departamento temos dois.um atributo de relacionamento em Empregado, enquanto que em Departamento temos dois. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 4 ExemploExemplo Relacionamentos BidirecionaisRelacionamentos Bidirecionais DepartamentoDepartamento sigla:sigla: nullnull nome:nome: nullnull DepartamentoDepartamento sigla:sigla: nome:nome: StringString “RH”“RH” StringString “Recursos “Recursos Humanos”Humanos” StringString “12345678“12345678--90”90” StringString EmpregadoEmpregado cpf: cpf: nome:nome: depto:depto: C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - listaEmpregados:listaEmpregados: nullnull gerente:gerente: nullnull listaEmpregados:listaEmpregados: gerente:gerente: Humanos”Humanos” “José ”“José ” nullnullnullnull 00 11 22 ...... 9999 StringString “09876543“09876543--21”21” StringString “Maria”“Maria” depto:depto: EmpregadoEmpregado cpf: cpf: nome:nome: depto:depto: 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 5 Métodos para Estabelecer RelacionamentosMétodos para Estabelecer Relacionamentos •• Além de colocarmos os atributos de relacionamento, Além de colocarmos os atributos de relacionamento, necessitamos colocar métodosnecessitamos colocar métodos que estarão estabelecendo os que estarão estabelecendo os relacionamento entre os objetos relacionamento entre os objetos e, conseqüentemente, e, conseqüentemente, manipulando os atributos de relacionamento. manipulando os atributos de relacionamento. •• Caso o Caso o relacionamento relacionamento seja seja unáriounário (ou seja, se o (ou seja, se o atributo de atributo de relacionamento relacionamento nãonão é uma coleçãoé uma coleção), deveremos colocar um ), deveremos colocar um C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - relacionamento relacionamento nãonão é uma coleçãoé uma coleção), deveremos colocar um ), deveremos colocar um método método set___set___.. •• Caso o Caso o relacionamentorelacionamento seja seja nn--árioário (ou seja, se o (ou seja, se o atributo de atributo de relacionamento é uma coleçãorelacionamento é uma coleção), deveremos colocar os ), deveremos colocar os métodos métodos add___add___ e e remove___remove___.. •• A implementação destes métodos deve levar em conta se o A implementação destes métodos deve levar em conta se o relacionamento é unidirecional ou bidirecional.relacionamento é unidirecional ou bidirecional. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 6 Métodos para Estabelecer Métodos para Estabelecer Relacionamentos BidirecionaisRelacionamentos Bidirecionais NA CLASSE EMPREGADONA CLASSE EMPREGADO publicpublic voidvoid setDeptosetDepto((DepartamentoDepartamento depto)depto) {{ // Se a referência para o departamento do Empregado é a mesma que// Se a referência para o departamento do Empregado é a mesma que // está sendo recebida pelo parâmetro, não há necessidade de atualização//está sendo recebida pelo parâmetro, não há necessidade de atualização ifif((thisthis.depto == depto).depto == depto) returnreturn;; // Se o parâmetro é // Se o parâmetro é nullnull, isto indica que o Empregado deve ser retirado, isto indica que o Empregado deve ser retirado // do departamento.// do departamento. ifif(depto == (depto == nullnull)) {{ Departamento Departamento antigo = antigo = thisthis.depto;.depto; C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - Departamento Departamento antigo = antigo = thisthis.depto;.depto; // Apago a referência antiga// Apago a referência antiga thisthis.depto = .depto = nullnull;; // Solicito ao Departamento para retirar sua referência para o Empregado// Solicito ao Departamento para retirar sua referência para o Empregado antigo.antigo.removeEmpregadoremoveEmpregado((thisthis); ); }} elseelse {{ // Se o Empregado já pertence a um Departamento, vou solicitar sua remoção para// Se o Empregado já pertence a um Departamento, vou solicitar sua remoção para // colocá// colocá--lo em outro Departamento.lo em outro Departamento. ifif((thisthis.depto != .depto != nullnull)) thisthis..depto.depto.removeEmpregadoremoveEmpregado((thisthis);); // Estabeleço a referência// Estabeleço a referência thisthis.depto = depto;.depto = depto; // solicito ao Departamento para adicionar uma referência para o Empregado.// solicito ao Departamento para adicionar uma referência para o Empregado. deptodepto..addEmpregadoaddEmpregado((thisthis);); }} }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 7 Métodos para Estabelecer Métodos para Estabelecer Relacionamentos BidirecionaisRelacionamentos Bidirecionais NA CLASSE DEPARTAMENTONA CLASSE DEPARTAMENTO publicpublic voidvoid addEmpregadoaddEmpregado((EmpregadoEmpregado novoEmpnovoEmp)) {{ // Se a referência para o Empregado já está presente na lista de// Se a referência para o Empregado já está presente na lista de // Empregados do Departamento, não há necessidade de atualização// Empregados do Departamento, não há necessidade de atualização ifif((thisthis..listaEmpregadoslistaEmpregados..containscontains((novoEmpnovoEmp)))) returnreturn;; // Solicito ao objeto de coleção referenciado por // Solicito ao objeto de coleção referenciado por thisthis..listaEmpregadoslistaEmpregados // que adicione uma referência para o novo empregado// que adicione uma referência para o novo empregado thisthis..listaEmpregadoslistaEmpregados..addadd((novoEmpnovoEmp);); // Solicito ao Empregado que referencie o seu novo departamento// Solicito ao Empregado que referencie o seu novo departamento C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - // Solicito ao Empregado que referencie o seu novo departamento// Solicito ao Empregado que referencie o seu novo departamento novoEmpnovoEmp..setDeptosetDepto((thisthis); ); }} publicpublic voidvoid removeEmpregadoremoveEmpregado((EmpregadoEmpregado exEmpexEmp)) {{ // Se a referência para o Empregado não está presente na lista de// Se a referência para o Empregado não está presente na lista de // Empregados do Departamento, não há necessidade de atualização// Empregados do Departamento, não há necessidade de atualização ifif( ( !! thisthis..listaEmpregadoslistaEmpregados..containscontains((exEmpexEmp)))) returnreturn;; // Solicito ao objeto de coleção referenciado por // Solicito ao objeto de coleção referenciado por thisthis..listaEmpregadoslistaEmpregados // que remova a referência para o ex// que remova a referência para o ex--empregadoempregado thisthis..listaEmpregadoslistaEmpregados..removeremove((exEmpexEmp);); // Solicito ao Empregado que deixe de referenciar o departamento// Solicito ao Empregado que deixe de referenciar o departamento exEmpexEmp..setDeptosetDepto((nullnull); ); }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 8 Exemplo RelacionalExemplo Relacional •• A idéia de A idéia de adicionarmos atributos para a implementação de adicionarmos atributos para a implementação de relacionamentos relacionamentos também ocorre com o uso do também ocorre com o uso do modelo modelo relacional relacional através do conceito de através do conceito de Chave EstrangeiraChave Estrangeira. . •• Lá, entretanto, não há a diferença entre relacionamentos Lá, entretanto, não há a diferença entre relacionamentos unidirecionais e bidirecionais.unidirecionais e bidirecionais. •• Para descobrirmos dados entre as entidades relacionadas, nós Para descobrirmos dados entre as entidades relacionadas, nós C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• Para descobrirmos dados entre as entidades relacionadas, nós Para descobrirmos dados entre as entidades relacionadas, nós necessitamos realizar operações de necessitamos realizar operações de JUNÇÃOJUNÇÃO.. sigla nome gerentegerente JR Jurídico 901-2 LG Logística 123-4 DEPARTAMENTO cpf nome deptodepto 123-4 José LG 567-8 Maria LG 901-2 Patrícia JR 345-6 João JR EMPREGADO 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 9 Uma Forma de Execução da JunçãoUma Forma de Execução da Junção SELECT D.Nome, E.Nome SELECT D.Nome, E.Nome (3º(3º-- projeção)projeção) FROM Departamento D, Empregado E FROM Departamento D, Empregado E (1º(1º-- Prod.Cartesiano)Prod.Cartesiano) WHERE D.gerente = E.Cpf WHERE D.gerente = E.Cpf (2º(2º-- Seleção)Seleção) E.cpf E.nome E.deptoE.depto 123-4 José LG D.sigla D.nome D.gerenteD.gerente JR Jurídico 901-2 C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - 123-4 José LG 567-8 Maria LG 901-2 Patrícia JR 345-6 João JR JR Jurídico 901-2 LG Logística 123-4 JR Jurídico 901-2 LG Logística 123-4 123-4 José LG 567-8 Maria LG 901-2 Patrícia JR 345-6 João JR LG Logística 123-4 LG Logística 123-4 JR Jurídico 901-2 JR Jurídico 901-2 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 10 ColeçõesColeções •• A implementação de atributos nA implementação de atributos n--ários com ários com arrays arrays não é adequada. não é adequada. (Arrays ou apresentam disperdício ou apresentam falta de posições de (Arrays ou apresentam disperdício ou apresentam falta de posições de memória).memória). •• Uma idéia melhor é utilizar a classe Uma idéia melhor é utilizar a classe java.util.Vectorjava.util.Vector.. •• Comparação entre Array x VectorComparação entre Array x Vector –– ArraysArrays •• Tamanho fixo e definido na criação do array.Tamanho fixo e definido na criação do array. C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• Tamanho fixo e definido na criação do array.Tamanho fixo e definido na criação do array. •• Procura pelo índice.Procura pelo índice. •• Elementos do mesmo tipo.Elementos do mesmo tipo. •• Arrays de tipos primitivos ou de ponteiros para instâncias de uma Arrays de tipos primitivosou de ponteiros para instâncias de uma classe específica.classe específica. –– Objetos VectorObjetos Vector •• O tamanho inicial é definido quando o vector é criado. Este pode ser O tamanho inicial é definido quando o vector é criado. Este pode ser modificado manualmente ou automaticamente.modificado manualmente ou automaticamente. •• Procura pelo índice ou conteúdo.Procura pelo índice ou conteúdo. •• Elementos de qualquer classe.Elementos de qualquer classe. •• Vectors de ponteiros para instâncias de uma classe específicaVectors de ponteiros para instâncias de uma classe específica 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 11 ColeçõesColeções public class Departamentopublic class Departamento {{ private Stringprivate String sigla;sigla; private Stringprivate String nome;nome; private private VectorVector listaEmpregados;listaEmpregados; private Empregado gerente;private Empregado gerente; public Departamento(String sigla, String nome)public Departamento(String sigla, String nome) {{ public class Empregadopublic class Empregado {{ private Stringprivate String cpf;cpf; private Stringprivate String nome;nome; private Departamento depto;private Departamento depto; public Empregado(String cpf, String nome, public Empregado(String cpf, String nome, Departamento depto)Departamento depto) {{ C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - {{ this.sigla = sigla;this.sigla = sigla; this.nome = nome;this.nome = nome; this.listaEmpregados = this.listaEmpregados = new Vector( );new Vector( ); }} public void addEmpregado(Empregado novoEmp)public void addEmpregado(Empregado novoEmp) {{ ...... }} public void removeEmpregado(Empregado exEmp)public void removeEmpregado(Empregado exEmp) {{ ...... }} ...... }} {{ this.cpf = cpf;this.cpf = cpf; this.nome = nome;this.nome = nome; this.setDepto(depto);this.setDepto(depto); }} public void setDepto(Departamento depto)public void setDepto(Departamento depto) {{ ...... }} ...... }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 12 Exemplo com VectorExemplo com Vector Relacionamentos Bidirecionais Relacionamentos Bidirecionais DepartamentoDepartamento sigla:sigla: nullnull nome:nome: nullnull DepartamentoDepartamento sigla:sigla: nome:nome: StringString “RH”“RH” StringString “Recursos “Recursos Humanos”Humanos” StringString “12345678“12345678--90”90” StringString EmpregadoEmpregado cpf: cpf: nome:nome: depto:depto: C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - listaEmpregados:listaEmpregados: nullnull gerente:gerente: nullnull listaEmpregados:listaEmpregados: gerente:gerente: Humanos”Humanos” “José ”“José ” StringString “09876543“09876543--21”21” StringString “Maria”“Maria” depto:depto: EmpregadoEmpregado cpf: cpf: nome:nome: depto:depto: VectorVector 0 1 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 13 ColeçõesColeções •• Alguns métodos úteis da classe Alguns métodos úteis da classe VectorVector:: –– VectorVector()()::Cria uma nova instância sem elementos e com capacidade Cria uma nova instância sem elementos e com capacidade inicial para 10 elementos.inicial para 10 elementos. –– VectorVector((intint capacidade)capacidade): Cria uma nova instância sem elementos e : Cria uma nova instância sem elementos e com capacidade inicial especificada pelo parâmetro.com capacidade inicial especificada pelo parâmetro. –– VectorVector((intint capacidade, capacidade, intint fator)fator): Cria uma nova instância : Cria uma nova instância sem elementos e com capacidade inicial / fator de crescimento sem elementos e com capacidade inicial / fator de crescimento especificados pelos parâmetros.especificados pelos parâmetros. –– addadd((ObjectObject elem)elem): adiciona um objeto no final do : adiciona um objeto no final do VectorVector. . C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - –– addadd((ObjectObject elem)elem): adiciona um objeto no final do : adiciona um objeto no final do VectorVector. . –– addadd((intint índice, índice, ObjectObject elemelem)): adiciona um objeto na posição : adiciona um objeto na posição especificada que deve estar entre 0 e o tamanho do especificada que deve estar entre 0 e o tamanho do VectorVector.. –– setElementAtsetElementAt((ObjectObject elem,elem,intint índice)índice): coloca o objeto em : coloca o objeto em determinada posição, removendo o objeto que estiver lá anteriormente.determinada posição, removendo o objeto que estiver lá anteriormente. –– remove(remove(ObjectObject elem)elem): remove a primeira ocorrência do objeto no : remove a primeira ocorrência do objeto no VectorVector. Retorna . Retorna truetrue caso tenha sido possível a remoção.caso tenha sido possível a remoção. –– remove (remove (intint índice)índice): remove o objeto na posição especificada.: remove o objeto na posição especificada. –– sizesize()(): retorna o número de objetos presentes no : retorna o número de objetos presentes no VectorVector.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 14 ColeçõesColeções –– get(int índice)get(int índice): Retorna o objeto presente na posição especificada. : Retorna o objeto presente na posição especificada. –– firstElement()firstElement(): Retorna o objeto presente na primeira posição. : Retorna o objeto presente na primeira posição. –– lastElement()lastElement(): Retorna o objeto presente na última posição. : Retorna o objeto presente na última posição. –– indexOf(Object elem)indexOf(Object elem): retorna o índice da primeira ocorrência do : retorna o índice da primeira ocorrência do objeto no Vector ou objeto no Vector ou --1 se o objeto não estiver presente. 1 se o objeto não estiver presente. –– indexOf(Object elem,int índice)indexOf(Object elem,int índice): retorna o índice da primeira : retorna o índice da primeira ocorrência do objeto no Vector a partir da posição especificada. Retorna ocorrência do objeto no Vector a partir da posição especificada. Retorna -- C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - ocorrência do objeto no Vector a partir da posição especificada. Retorna ocorrência do objeto no Vector a partir da posição especificada. Retorna -- 1 se o objeto estiver presente. 1 se o objeto estiver presente. –– lastIndexOf(Object elem)lastIndexOf(Object elem): retorna o índice da última ocorrência do : retorna o índice da última ocorrência do objeto no Vector ou objeto no Vector ou --1 se o objeto não estiver presente. 1 se o objeto não estiver presente. –– lastIndexOf(Object elem,int índice)lastIndexOf(Object elem,int índice): retorna o índice da última : retorna o índice da última ocorrência do objeto no Vector a partir da posição especificada. Retorna ocorrência do objeto no Vector a partir da posição especificada. Retorna --1 se o objeto estiver presente. 1 se o objeto estiver presente. –– contains(Object elem)contains(Object elem): Informa se o objeto está presente no : Informa se o objeto está presente no Vector.Vector. 1 7 / 0 8/ 2 0 1 3 1 7 / 0 8 / 2 0 1 3 15 Coleções no JDK 1.2Coleções no JDK 1.2 •• Com o advento do Com o advento do jdkjdk 1.21.2, , A classe A classe VectorVector está sendo está sendo evitadaevitada pois os seus métodos são pois os seus métodos são synchronizedsynchronized (não (não permite acesso concorrente aos dados do permite acesso concorrente aos dados do VectorVector).). •• A estrutura das classes de coleção A estrutura das classes de coleção (pacote (pacote javajava..utilutil)) está está colocada da seguinte forma:colocada da seguinte forma: ObjectObject CollectionCollection InterfaceInterface ClasseClasse EspecializaçãoEspecialização RealizaçãoRealização LegendaLegenda C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - LinkedListLinkedList ArrayListArrayList Abstract Abstract SequentialSequential ListList SetSet SortedSetSortedSet ListList TreeSetTreeSet AbstractAbstract CollectionCollection Abstract Abstract ListList VectorVector Abstract Abstract SetSet HashSetHashSet 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 16 Conceito de InterfaceConceito de Interface •• Em Java e na UML, uma Em Java e na UML, uma InterfaceInterface:: –– Se assemelha a uma Se assemelha a uma classe abstrataclasse abstrata –– Não apresenta atributosNão apresenta atributos (somente constantes)(somente constantes) –– Não apresenta códigoNão apresenta código para os seus métodospara os seus métodos** –– Possui somente as assinaturas dos métodosPossui somente as assinaturas dos métodos que deverão que deverão ser codificados pelas classes que implementarem a ser codificados pelas classes que implementarem a C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - ser codificados pelas classes que implementarem a ser codificados pelas classes que implementarem a interface.interface.** •• Obs*Obs* -- Se um método não apresenta código é só possui a sua assinatura, Se um método não apresenta código é só possui a sua assinatura, então ele é um então ele é um método abstratométodo abstrato.. •• Uma interface pode ser vista como a especificação Uma interface pode ser vista como a especificação de um de um serviçoserviço que pode ser que pode ser realizadorealizado por uma ou mais por uma ou mais classes.classes. •• Geralmente optaGeralmente opta--se por uma interface (e não por uma classe se por uma interface (e não por uma classe abstrata) quando não se sabe como implementar o serviço ou abstrata) quando não se sabe como implementar o serviço ou quando o serviço pode ser implementado de várias maneiras.quando o serviço pode ser implementado de várias maneiras. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 17 Conceito de InterfaceConceito de Interface •• RealizaçãoRealização –– Relacionamento definido na UML e em Java que indica Relacionamento definido na UML e em Java que indica que uma determinada que uma determinada classeclasse irá realizar irá realizar o o serviço serviço especificado por uma especificado por uma interfaceinterface. Em Java costumamos . Em Java costumamos popularmente chamar a realização de popularmente chamar a realização de implementaçãoimplementação.. –– RealizarRealizar (ou (ou implementarimplementar) uma interface significa que ) uma interface significa que a a Set <<interface>> C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - –– RealizarRealizar (ou (ou implementarimplementar) uma interface significa que ) uma interface significa que a a classe deverá implementar todos os métodos assinados classe deverá implementar todos os métodos assinados na interfacena interface. Se algum método ficar de fora, o . Se algum método ficar de fora, o compilador irá considerar a compilador irá considerar a classe abstrataclasse abstrata.. –– Uma classe pode implementar quantas interfaces Uma classe pode implementar quantas interfaces quiser.quiser. –– O conceito de polimorfismo se aplica aos objetos de O conceito de polimorfismo se aplica aos objetos de uma classe que implementam uma interface uma classe que implementam uma interface –– Ex:Ex: public class public class HashSetHashSet implementsimplements Set Set { ... }{ ... } Assim objetos Assim objetos HashSetHashSet também podem ser vistos como objetos também podem ser vistos como objetos SetSet HashSet 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 18 Interface e RealizaçãoInterface e Realização ExemploExemplo �� produzproduz LimpadorLimpador limpar()limpar() <<interface>><<interface>> FábricaFábrica 1..*1..* 11 C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - LavaLava--JatoJato limpar()limpar() Aspirador de PóAspirador de Pó limpar()limpar() Limpador deLimpador de PáraPára--brisabrisa limpar()limpar() LavaLava--RoupasRoupas limpar()limpar() LavaLava--LouçaLouça limpar()limpar() OBS: É melhor deixar Limpador como Interface pois esta apresenta todas as características de umaOBS: É melhor deixar Limpador como Interface pois esta apresenta todas as características de uma interface e assim estamos livres para deixar as classes que implementam esta interface como interface e assim estamos livres para deixar as classes que implementam esta interface como especializações de uma outra classe (ex. Equipamento Elétrico). Lembreespecializações de uma outra classe (ex. Equipamento Elétrico). Lembre--se que em Java uma classe se que em Java uma classe só pode ser especialização direta de uma outra classe!só pode ser especialização direta de uma outra classe! 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 19 Interface e RealizaçãoInterface e Realização ExemploExemplo •• Objetos Objetos LavaLava--JatoJato, , Aspirador de PóAspirador de Pó, , Limpador de PáraLimpador de Pára--BrisaBrisa, , LavaLava-- RoupasRoupas e e LavaLava--LouçaLouça apresentam algumas propriedades em comum. apresentam algumas propriedades em comum. Todas são equipamentos produzidos por uma fábricaTodas são equipamentos produzidos por uma fábrica e que e que realizam o realizam o serviçoserviço de limpezade limpeza. Suponha que a execução da limpeza seja executada . Suponha que a execução da limpeza seja executada através do método através do método limpar()limpar().. •• Para caracterizar que estas classes são limpadores, poderíamos criar Para caracterizar que estas classes são limpadores, poderíamos criar C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• Para caracterizar que estas classes são limpadores, poderíamos criar Para caracterizar que estas classes são limpadores, poderíamos criar uma uma classe abstrataclasse abstrata chamada chamada LimpadorLimpador com uma com uma associação com associação com FábricaFábrica e e apresentando o método apresentando o método limpar()limpar().. •• Entretanto, observe que a supostaclasse Entretanto, observe que a suposta classe Limpador não apresentaria Limpador não apresentaria atributosatributos e e seu único método é abstratoseu único método é abstrato (a forma como cada classe irá (a forma como cada classe irá implementar o método limpar() é diferente e não conseguimos produzir implementar o método limpar() é diferente e não conseguimos produzir uma implementação que valha para todas as suas especializações).uma implementação que valha para todas as suas especializações). 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 20 Interface e RealizaçãoInterface e Realização ExemploExemplo •• Assim, Assim, é melhor caracterizar a classe Limpador como interfaceé melhor caracterizar a classe Limpador como interface pois pois apresenta todas as características da mesma e, assim, permitimos que apresenta todas as características da mesma e, assim, permitimos que as suas realizações possam ser especializações de uma outra classe as suas realizações possam ser especializações de uma outra classe (lembre(lembre--se que em Java não há herança múltipla).se que em Java não há herança múltipla). •• Contudo, observe que Contudo, observe que na realização há a presença da característica do na realização há a presença da característica do C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• Contudo, observe que Contudo, observe que na realização há a presença da característica do na realização há a presença da característica do polimorfismopolimorfismo; pois os objetos ; pois os objetos FábricaFábrica vêem os objetos vêem os objetos LavaLava--JatoJato, , Aspirador de PóAspirador de Pó, , Limpador de PáraLimpador de Pára--BrisaBrisa, , LavaLava--RoupasRoupas e e LavaLava--LouçaLouça como como objetos da interface Limpadorobjetos da interface Limpador.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 21 Interface e RealizaçãoInterface e Realização Exemplo Exemplo (talvez um pouco mais lúdico)(talvez um pouco mais lúdico) CarrascoCarrasco torturar()torturar() <<interface>><<interface>> PessoaPessoa ChoradorChorador chorar()chorar() <<interface>><<interface>> cpfcpf nomenome endereçoendereço C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - PolíticoPolítico chorar()chorar() AlunoAluno chorar()chorar() TerroristaTerrorista torturar()torturar() ProfessorProfessor torturar()torturar() 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 22 Codificando...Codificando... public public interfaceinterface CarrascoCarrasco {{ publicpublic voidvoid torturartorturar();(); }} publicpublic classclass ProfessorProfessor extendsextends PessoaPessoa implementsimplements CarrascoCarrasco C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - publicpublic classclass ProfessorProfessor extendsextends PessoaPessoa implementsimplements CarrascoCarrasco {{ ...... publicpublic voidvoid torturartorturar()() {{ SystemSystem..out.printlnout.println((“Se não estudar, vou te reprovar!!!!”“Se não estudar, vou te reprovar!!!!”);); }} ...... }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 23 Coleções no JDK 1.2Coleções no JDK 1.2 •• Interface Interface CollectionCollection –– Uma Uma collection collection representa um serviço capaz de apontar para representa um serviço capaz de apontar para um um conjunto de objetosconjunto de objetos que que não estão necessariamentenão estão necessariamente postos em uma ordem de posição arbitrada pelo postos em uma ordem de posição arbitrada pelo programadorprogramador e que e que pode apresentar duplicaçõespode apresentar duplicações.. –– Métodos ImportantesMétodos Importantes:: boolean boolean addadd(Object o) (Object o) boolean boolean addAlladdAll(Collection c)(Collection c) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - boolean boolean addadd(Object o) (Object o) boolean boolean addAlladdAll(Collection c)(Collection c) void void clearclear()() boolean boolean containscontains(Object o)(Object o) Iterator Iterator iteratoriterator()() boolean boolean removeremove(Object o )(Object o ) boolean boolean removeAllremoveAll(Collection c)(Collection c) int int sizesize()() •• Classe Abstrata Classe Abstrata AbstractCollectionAbstractCollection –– Superclasse de todas as coleções.Superclasse de todas as coleções. –– É uma classe abstrata pois na realidade não implementa os É uma classe abstrata pois na realidade não implementa os métodos previstos na interface Collection.métodos previstos na interface Collection. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 24 Coleções no JDK 1.2Coleções no JDK 1.2 •• Interface Interface ListList –– Especialização de Collection; Uma lista representa um serviço capaz Especialização de Collection; Uma lista representa um serviço capaz de apontar para de apontar para um conjunto de objetos um conjunto de objetos que que estão colocados em estão colocados em uma ordem de posição arbitrada pelo programadoruma ordem de posição arbitrada pelo programador e que e que pode pode apresentar duplicação de elementosapresentar duplicação de elementos. . –– Assim, o programador determinar que elemento ficará na posição 0, Assim, o programador determinar que elemento ficará na posição 0, na posição 1, etc.na posição 1, etc. C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - na posição 1, etc.na posição 1, etc. –– Métodos ImportantesMétodos Importantes:: Object Object getget(int posicao) (int posicao) int int indexOfindexOf(Object o)(Object o) void void addadd(int posicao, Object o)(int posicao, Object o) boolean boolean containscontains(Object o)(Object o) Object Object setset(int posicao, Object o) List (int posicao, Object o) List subListsubList(int inicio, int fim)(int inicio, int fim) �� Além dos métodos de Além dos métodos de CollectionCollection •• Classe Abstrata Classe Abstrata AbstractListAbstractList –– Superclasse para as listas.Superclasse para as listas. –– É uma classe abstrata pois não implementa os métodos da interfaceÉ uma classe abstrata pois não implementa os métodos da interface 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 25 Coleções do JDK 1.2Coleções do JDK 1.2 •• Classe Classe ArrayListArrayList –– Implementação (ou realização) da interface Implementação (ou realização) da interface ListList.. –– Seu comportamento está baseado em possuir um Seu comportamento está baseado em possuir um arrayarray de de referências para referências para ObjectObject que aponta para os elementos da lista. que aponta para os elementos da lista. –– Se o tamanho do Se o tamanho do arrayarray for insuficiente: for insuficiente: •• CriaCria--se um novo se um novo arrayarray com o tamanho maior;com o tamanho maior; •• CopiaCopia--se o conteúdo do antigo se o conteúdo do antigo arrayarray para o novo;para o novo; C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• CopiaCopia--se o conteúdo do antigo se o conteúdo do antigo arrayarray para o novo; para o novo; •• DescartaDescarta--se o antigo (sofrerá o se o antigo (sofrerá o GarbageGarbage CollectionCollection).). –– Bom para recuperação aleatória por posição; “Ruim” para inserção Bom para recuperação aleatória por posição; “Ruim” para inserção se realizar o redimensionamento do se realizar o redimensionamento do arrayarray a cada instante.a cada instante. –– Para melhorar o desempenho, podemos utilizar o método Para melhorar o desempenho, podemos utilizar o método ensureCapacityensureCapacity(tamanho)(tamanho) 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 26 Coleções do JDK 1.2Coleções do JDK 1.2 •• Classe Classe LinkedListLinkedList –– Seu comportamento está baseado em implementar Seu comportamento está baseado em implementar uma uma lista encadeadalista encadeada –– Bom para inserção; “Ruim” para recuperação aleatória Bom para inserção; “Ruim” para recuperação aleatória por posição já que há a necessidade de navegação pela por posição já que há a necessidade de navegação pela C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - por posição já que há a necessidade de navegação pela por posição já que há a necessidade de navegação pela lista. Entretanto, se a recuperação for iterativa (ou lista. Entretanto, se a recuperação for iterativa (ou seja, posição a posição) não há problemas. seja, posição a posição) não há problemas. •• Classe VectorClasse Vector –– Comportamento igual ao do ArrayList porém o Vector é Comportamento igual ao do ArrayList porém o Vector é synchronizedsynchronized; ou seja, não permite acesso concorrente.; ou seja, não permite acesso concorrente. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 27 IteratorIterator •• Objeto que permite a recuperação seqüencial dos Objeto que permite a recuperação seqüencial dos elementos de uma coleção.elementos de uma coleção. CollectionCollection colecao;colecao; ...... forfor((IteratorIterator it = colecao.it = colecao.iterator()iterator(); it.; it.hasNext()hasNext(); ); ) {{ C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - {{ <Classe><Classe> elemento = (elemento = (<Classe><Classe>)it.)it.next()next();; ...... }} –– Métodos ImportantesMétodos Importantes:: boolean boolean hasNexthasNext( ) ( ) �� Informa se o iterator ainda pode retornar algum Informa se o iterator ainda pode retornar algum elementoelemento Object Object nextnext() () �� Retorna o próximo elemento da iteraçãoRetorna o próximo elemento da iteração 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 28 Coleções no JDK 1.2Coleções no JDK 1.2 •• Interface SetInterface Set –– Especialização de Especialização de CollectionCollection; Um set representa um serviço capaz ; Um set representa um serviço capaz de apontar para de apontar para um conjunto de objetos um conjunto de objetos que que não estão não estão necessariamente colocados em uma ordem de posição arbitrada necessariamente colocados em uma ordem de posição arbitrada pelo programadorpelo programador e que e que não não permite a duplicação de elementospermite a duplicação de elementos. . –– Métodos ImportantesMétodos Importantes:: Os mesmos de Os mesmos de CollectionCollection.. C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - Os mesmos de Os mesmos de CollectionCollection.. •• Classe Classe HashSetHashSet –– Implementação de Set. Para isto, utiliza internamente uma Implementação de Set. Para isto, utiliza internamente uma HashMapHashMap.. –– Métodos ImportantesMétodos Importantes:: HashSetHashSet((intint capacidadeInicialcapacidadeInicial)) HashSetHashSet((intint capacidadeInicialcapacidadeInicial, , floatfloat fatorDeCargafatorDeCarga)) 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 29 Coleções no JDK 1.2Coleções no JDK 1.2 •• Interface Interface SortedSetSortedSet –– Especialização de Especialização de SetSet; Um ; Um SortedSetSortedSet representa um serviço capaz de representa um serviço capaz de apontar para apontar para um conjunto de objetos sem duplicações um conjunto de objetos sem duplicações cujos elementos cujos elementos estão dispostos ordenadamenteestão dispostos ordenadamente segundo algum critério especificado. segundo algum critério especificado. –– Para viabilizar a ordenação, é necessário que o Para viabilizar a ordenação, é necessário que o SortedSetSortedSet saiba o saiba o critério critério para ordenaçãopara ordenação. Para especificação do critério, devemos fazer com que os . Para especificação do critério, devemos fazer com que os elementos do elementos do SortedSetSortedSet implementem a interface implementem a interface ComparableComparable ouou passarmos para o passarmos para o SortedSetSortedSet um objeto que implemente a interface um objeto que implemente a interface C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - passarmos para o passarmos para o SortedSetSortedSet um objeto que implemente a interface um objeto que implemente a interface ComparatorComparator.. –– Métodos ImportantesMétodos Importantes:: Os mesmos de Os mesmos de SetSet.. •• Classe Classe TreeSetTreeSet –– Implementa um Implementa um SortedSetSortedSet cuja complexidade de ordenação é cuja complexidade de ordenação é LogLog(n) (n) –– Métodos ImportantesMétodos Importantes:: TreeSetTreeSet( ) ( ) �� Os elementos deverão implementar Os elementos deverão implementar ComparableComparable TreeSetTreeSet((ComparatorComparator comparador) comparador) �� Utiliza um comparador para Utiliza um comparador para estabelecer a ordemestabelecer a ordem 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 30 ComparableComparable •• Se ao criar um TreeSet não indicamos umSe ao criar um TreeSet não indicamos um ComparatorComparator, ele , ele considerará que as classes de seus elementos implementam a considerará que as classes de seus elementos implementam a interface interface Comparable.Comparable. –– Interface ComparableInterface Comparable •• int compareTo(Object o)int compareTo(Object o) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - –– Se o objeto que receber a mensagem (Se o objeto que receber a mensagem (thisthis) é ) é igualigual ao ao objeto recebido como parâmetro, então o método deve objeto recebido como parâmetro, então o método deve retornar 0 (Zero)retornar 0 (Zero) –– Se o objeto que receber a mensagem (Se o objeto que receber a mensagem (thisthis) ) vem primeirovem primeiroque o objeto recebido como parâmetro, então o método que o objeto recebido como parâmetro, então o método deve retornar um deve retornar um número negativonúmero negativo.. –– Se o objeto que receber a mensagem Se o objeto que receber a mensagem (this(this) ) vem depoisvem depois que o objeto recebido como parâmetro, então o método que o objeto recebido como parâmetro, então o método deve retornar um deve retornar um número positivonúmero positivo.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 31 ComparableComparable •• Exemplo de Comparação com StringsExemplo de Comparação com Strings publicpublic classclass EmpregadoEmpregado implementsimplements ComparableComparable {{ privateprivate StringString nomenome; ; ...... publicpublic intint compareTocompareTo((ObjectObject oo)) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - publicpublic intint compareTocompareTo((ObjectObject oo)) {{ ifif((oo instanceofinstanceof EmpregadoEmpregado)) {{ EmpregadoEmpregado ee = = (Empregado)(Empregado)oo;; returnreturn thisthis..nomenome..compareTocompareTo((ee..nomenome);); }} returnreturn ––11;; }} }} A classe String também é uma realização de A classe String também é uma realização de ComparableComparable!! 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 32 ComparableComparable •• Exemplo de Comparação NuméricaExemplo de Comparação Numérica public classpublic class EmpregadoEmpregado implements implements ComparableComparable {{ private private intint idadeidade; ; ...... public public intint compareTocompareTo((ObjectObject oo)) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - public public intint compareTocompareTo((ObjectObject oo)) {{ if(if(oo instanceofinstanceof EmpregadoEmpregado)) {{ EmpregadoEmpregado ee = = (Empregado)(Empregado)oo;; return return this.this.idade idade -- ee..idadeidade;; }} return return ––11;; }} }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 33 Erros Vinculados à Erros Vinculados à implementação do Comparableimplementação do Comparable •• Se em uma classe colocarmos a indicação Se em uma classe colocarmos a indicação “implements Comparable”“implements Comparable” mas não adicionarmos mas não adicionarmos o método o método “compareTo”“compareTo”, o compilador acusará , o compilador acusará erroerro.. •• Da mesma forma, não adianta colocar o método Da mesma forma, não adianta colocar o método “compareTo”“compareTo” e não colocarmos a indicação e não colocarmos a indicação C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - “compareTo”“compareTo” e não colocarmos a indicação e não colocarmos a indicação “implements Comparable”“implements Comparable”, pois quando o , pois quando o TreeSetTreeSet utiliza o critério do utiliza o critério do ComparableComparable, ele só , ele só permite que sejam adicionados Objetos que sejam permite que sejam adicionados Objetos que sejam ComparableComparable. . Assim, este erro só será percebido em Assim, este erro só será percebido em tempo de execuçãotempo de execução.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 34 ComparatorComparator •• Se ao criar um TreeSet passamos um Comparator, este Se ao criar um TreeSet passamos um Comparator, este determinará a ordem dos elementos utilizando o método determinará a ordem dos elementos utilizando o método comparecompare.. –– Interface ComparatorInterface Comparator •• int compare(Object o1, Object o2)int compare(Object o1, Object o2) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• int compare(Object o1, Object o2)int compare(Object o1, Object o2) –– Se o objeto apontado por Se o objeto apontado por o1o1 é é igualigual ao objeto apontado ao objeto apontado por por o2o2, então o método deve retornar 0 (Zero), então o método deve retornar 0 (Zero) –– Se o objeto apontado por Se o objeto apontado por o1o1 vem primeirovem primeiro que o objeto que o objeto apontado por apontado por o2o2, então o método deve retornar um , então o método deve retornar um número negativonúmero negativo.. –– Se o objeto apontado por Se o objeto apontado por o1o1 vem depoisvem depois que o objeto que o objeto apontado por apontado por o2o2, então o método deve retornar um , então o método deve retornar um número positivonúmero positivo.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 35 ComparatorComparator •• Exemplo de ComparatorExemplo de Comparator public class ComparadorPorNome public class ComparadorPorNome implements Comparatorimplements Comparator {{ public int compare(Object public int compare(Object o1o1,, Object Object o2o2)) {{ if(if(o1o1 instanceofinstanceof Empregado && Empregado && C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - if(if(o1o1 instanceofinstanceof Empregado && Empregado && o2o2 instanceofinstanceof Empregado)Empregado) {{ Empregado Empregado e1e1 = = (Empregado)(Empregado)o1o1;; Empregado Empregado e2e2 = = (Empregado)(Empregado)o2o2;; return return e1.getNome()e1.getNome()..compareTocompareTo((e2.getNome()e2.getNome());); }} return return ––1;1; }} }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 36 Classe Classe CollectionsCollections •• É uma classe que contém vários métodos estáticos que fazem a É uma classe que contém vários métodos estáticos que fazem a manipulação dos objetos de coleção.manipulação dos objetos de coleção. –– Métodos ImportantesMétodos Importantes:: staticstatic voidvoid copycopy((ListList l1, l1, ListList l2) l2) staticstatic voidvoid reversereverse((ListList l)l) staticstatic voidvoid sortsort((ListList l) l) staticstatic voidvoid sortsort((ListList l, l, ComparatorComparator cmpcmp) ) staticstatic CollectionCollection unmodifiableCollectionunmodifiableCollection((CollectionCollection c) c) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - staticstatic CollectionCollection unmodifiableCollectionunmodifiableCollection((CollectionCollection c) c) staticstatic ListList unmodifiableListunmodifiableList((ListList c) c) staticstatic CollectionCollection synchronizedCollectionsynchronizedCollection((CollectionCollection c) c) staticstatic ListList synchronizedListsynchronizedList((ListList c) c) Exemplo:Exemplo: ArrayListArrayList lista = lista = newnew ArrayListArrayList();(); ...... CollectionsCollections..sortsort(lista); (lista); // Promoverá a ordenação da lista através de // Promoverá a ordenação da lista através de ComparableComparable´´ss •• Coleções Coleções SynchronizedSynchronized –– São aquelas que só podem ser manipuladas poruma única Thread a cada São aquelas que só podem ser manipuladas por uma única Thread a cada instante. A única exceção é a recuperação via instante. A única exceção é a recuperação via iteratoriterator.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 37 Operador Operador instanceofinstanceof •• Se quisermos Se quisermos testartestar um atributo ou variável local declarado um atributo ou variável local declarado como como ponteiro para um objeto de uma superclasseponteiro para um objeto de uma superclasse está está propriamente propriamente apontando para um objeto de uma de suas apontando para um objeto de uma de suas subclassessubclasses, devemos utilizar o operador , devemos utilizar o operador instanceofinstanceof.. // Elemento foi declarado como ponteiro para um // Elemento foi declarado como ponteiro para um // objeto da classe Object// objeto da classe Object C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - // objeto da classe Object// objeto da classe Object Object elemento = coleção.Object elemento = coleção.getget(posição); (posição); // Para sabermos se elemento na realidade está apontando// Para sabermos se elemento na realidade está apontando // para um objeto da classe String (subclasse), devemos// para um objeto da classe String (subclasse), devemos // utilizar o operador instanceof// utilizar o operador instanceof if(elemento if(elemento instanceofinstanceof String) String) { { ... ... }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 38 CastingCasting e instanceofe instanceof •• Observe que nos códigos exibidos temos a presença da seguinte linha:Observe que nos códigos exibidos temos a presença da seguinte linha: Empregado Empregado ee = = (Empregado)(Empregado)oo;; •• Por que há a necessidade de colocarmos Por que há a necessidade de colocarmos (Empregado)(Empregado)?? •• Java é uma Java é uma linguagem fortemente tipadalinguagem fortemente tipada!! –– Há Há intensa verificação dos tiposintensa verificação dos tipos feita pelo compilador nas operações que feita pelo compilador nas operações que C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - –– Há Há intensa verificação dos tiposintensa verificação dos tipos feita pelo compilador nas operações que feita pelo compilador nas operações que codificamos. codificamos. –– No caso de atribuições, No caso de atribuições, o compilador verificará se o tipo à direita é o compilador verificará se o tipo à direita é igual igual ou compatívelou compatível com o tipo à esquerdacom o tipo à esquerda •• Ex: Ex: int a = false;int a = false;// O tipo à direita (boolean) não é igual nem // O tipo à direita (boolean) não é igual nem // compatível com o tipo à esquerda (int)// compatível com o tipo à esquerda (int) –– A verificação também é feita na A verificação também é feita na passagem de parâmetrospassagem de parâmetros ((o tipo do o tipo do parâmetro deve ser parâmetro deve ser igual ou compatíveligual ou compatível com o especificado no com o especificado no métodométodo).). •• Observe que no código, o tipo de Observe que no código, o tipo de oo (elemento à direita) é “(elemento à direita) é “ponteiro ponteiro para um objeto da classe Objectpara um objeto da classe Object” e o tipo de ” e o tipo de ee (elemento à esquerda) (elemento à esquerda) é “é “ponteiro para um objeto da classe Empregadoponteiro para um objeto da classe Empregado”. ”. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 39 CastingCasting e instanceofe instanceof •• (Continuação(Continuação)) Neste caso, Neste caso, o tipo à direita não é igual nem compatível com o o tipo à direita não é igual nem compatível com o tipo à esquerdatipo à esquerda (nem sempre um ponteiro para Object está (nem sempre um ponteiro para Object está apontando para um Empregado).apontando para um Empregado). •• Mas, por causa do teste realizado previamente com o Mas, por causa do teste realizado previamente com o instanceofinstanceof, , sabemos que sabemos que oo ((ponteiro para Objectponteiro para Object) aponta para um ) aponta para um objeto objeto EmpregadoEmpregado.. C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - EmpregadoEmpregado.. •• Para o compilador não reclamar da operação (Para o compilador não reclamar da operação (Type Mismatch Type Mismatch –– tipo tipo incompatívelincompatível), ), devemos solicitar que ele veja devemos solicitar que ele veja somente neste instantesomente neste instante o ponteiro para Object como ponteiro para Empregadoo ponteiro para Object como ponteiro para Empregado. A esta . A esta operação denominamos de operação denominamos de castingcasting.. •• Se por acaso Se por acaso oo não estivesse apontando para um Empregado, a JVM não estivesse apontando para um Empregado, a JVM lançaria uma exceção chamada lançaria uma exceção chamada ClassCastExceptionClassCastException que abortaria a que abortaria a execução do programa.execução do programa. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 40 CastingCasting e instanceofe instanceof •• Sempre precisaremos de indicar um casting na recuperação de elementos, pois Sempre precisaremos de indicar um casting na recuperação de elementos, pois todos os métodos de recuperação foram codificados para retornar uma referência todos os métodos de recuperação foram codificados para retornar uma referência para para ObjectObject. Porém, na maioria das vezes, sabemos que eles pertencem a uma . Porém, na maioria das vezes, sabemos que eles pertencem a uma especialização de especialização de ObjectObject.. •• Observe o seguinte caso:Observe o seguinte caso: String str = coleção.get(posição);String str = coleção.get(posição); ptr para String ptr para Objectptr para String ptr para Object C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - ptr para String ptr para Objectptr para String ptr para Object •• O compilador irá acusar erro pois o tipo à direita não é igual nem compatível com O compilador irá acusar erro pois o tipo à direita não é igual nem compatível com o tipo à esquerda. Mas se soubermos que o tipo à esquerda. Mas se soubermos que Coleção.get(posição)Coleção.get(posição) sempre retornará sempre retornará uma String, devemos avisar isto para o compilador através de um uma String, devemos avisar isto para o compilador através de um Casting.Casting. String str = String str = (String)(String) coleção.get(posição);coleção.get(posição); •• Dica para o uso doDica para o uso do casting casting em atribuiçõesem atribuições –– Se o tipo da direita Se o tipo da direita não é igual ou compatívelnão é igual ou compatível com o tipo da com o tipo da esquerda, deveremos utilizar o Casting. esquerda, deveremos utilizar o Casting. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 41 Coleções no JDK 1.2Coleções no JDK 1.2 •• Classe HashtableClasse Hashtable –– Não Não está vinculada a interface está vinculada a interface Collection Collection (implementa (implementa na realidade a na realidade a interfaceinterface MapMap)) –– Funciona como uma tabela Hash. Para adicionarmos Funciona como uma tabela Hash. Para adicionarmos um elemento, temos que vincular a ele uma chave de um elemento, temos que vincular a ele uma chave de indexação que é utilizada para a recuperação. indexação que é utilizada para a recuperação. •• public void public void putput(Object chave, Object elemento)(Object chave, Object elemento) MapMap C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - •• public void public void putput(Object chave, Object elemento)(Object chave, Object elemento) –– Insere um elemento no Hashtable indexandoInsere um elemento no Hashtable indexando--o o pela chave passada. pela chave passada. •• public Object public Object getget(Object chave)(Object chave) –– Recupera o elemento indexado no Hashtable pela Recupera o elemento indexado no Hashtable pela chave fornecida.chave fornecida. –– A posição de um elemento é determinada por sua A posição de um elemento é determinada por sua função hashfunção hash. Em Java, todo objeto possui o método . Em Java, todo objeto possui o método hashCodehashCode() e este é utilizado como função hash.() e este é utilizado como função hash. –– Como Hashtable é Como Hashtable é synchronizedsynchronized, é melhor utilizar a , é melhor utilizar a classe classe HashMapHashMap.. HashtableHashtable DictionaryDictionary HashMapHashMap 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 42 Coleções no JDK 1.2Coleções no JDK 1.2 –– Outros Métodos Importantes de HashtableOutros Métodos Importantes de Hashtable:: HashtableHashtable()() HashtableHashtable(int capacidadeInicial)(int capacidadeInicial) HashtableHashtable(int capacidadeInicial, float fatorDeCarga)(int capacidadeInicial, float fatorDeCarga) boolean boolean containsValuecontainsValue(Object o) (Object o) C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - boolean boolean containsKeycontainsKey(Object o)(Object o) Set Set keySetkeySet()() Collection Collection valuesvalues()() Object Object removeremove(Object key(Object key)) –– HashtableHashtable é uma classe synchronized. Prefira a é uma classe synchronized. Prefira a classe classe HashMapHashMap.. 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 43 HashtableHashtable ExemploExemplo •• Se enviarmos a mensagem get(“12345678Se enviarmos a mensagem get(“12345678--90”) para o 90”) para o Hashtable, ele nos dará uma referência para o objeto Hashtable, ele nos dará uma referência para o objeto Empregado “José”.Empregado “José”. StringString “12345678“12345678--90”90” StringString EmpregadoEmpregado cpf: cpf: nome:nome: depto:depto: HashtableHashtable tabela:tabela: C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - “José ”“José ” depto:depto: ChavesChaves ObjetosObjetos StringString “12345678“12345678--90”90” StringString “09876543“09876543--21”21” StringString “09876543“09876543--21”21” StringString “Maria”“Maria” EmpregadoEmpregado cpf: cpf: nome:nome: depto:depto: 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 44 ColeçõesColeções Implementando Classes de AssociaçãoImplementando Classes de Associação •• Devemos substituir a modelagem proposta pela implementação Devemos substituir a modelagem proposta pela implementação de duas associações ligando a classe de associação com as de duas associações ligando a classe de associação com as classes envolvidas no relacionamento. classes envolvidas no relacionamento. •• No exemplo abaixo, apesar de termos modelado a associação No exemplo abaixo, apesar de termos modelado a associação ““Envolve a Venda deEnvolve a Venda de”, vamos substitui”, vamos substitui--la pelas associações em la pelas associações em vermelho. vermelho. Observe que as cardinalidades das extremidades são Observe que as cardinalidades das extremidades são C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - vermelho. vermelho. Observe que as cardinalidades das extremidades são Observe que as cardinalidades das extremidades são unárias e que as cardinalidades na classe de associação são unárias e que as cardinalidades na classe de associação são trocadas em relação ao que existia antes (em azul)trocadas em relação ao que existia antes (em azul).. Nota Fiscal Produto 0..* 0..* Envolve a Venda deEnvolve a Venda de�� 1..*1..* Número Data CódBarras Nome Item NumItens PreçoUnitário 11 1..*1..* 0..*0..* 11 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 45 Estabelecimento de RelacionamentosEstabelecimento de Relacionamentos ResumoResumo •• Quando o relacionamento for Quando o relacionamento for UnárioUnário –– Adicionamos um Adicionamos um atributoatributo cujo tipo será cujo tipo será ponteiro ponteiro para um objeto da classe <...>para um objeto da classe <...> –– Adicionamos um Adicionamos um métodométodo set<...>set<...> C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - –– Adicionamos um Adicionamos um métodométodo set<...>set<...> •• Quando o relacionamento for Quando o relacionamento for NN--árioário –– Adicionamos um Adicionamos um atributoatributo cujo tipo será cujo tipo será ponteiro ponteiro para um objeto de coleçãopara um objeto de coleção –– Adicionamos os Adicionamos os métodosmétodos addadd<...> <...> ee remove<...>remove<...> 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 Estabelecimento de RelacionamentosEstabelecimento de Relacionamentos ResumoResumo Estrutura do Método Estrutura do Método set____________set____________ publicpublic voidvoid setset[ATRIBUTO][ATRIBUTO](([CLASS[CLASSE_APONTADA]E_APONTADA] objClasseobjClasse) {) { // Se // Se [ATRIBUTO][ATRIBUTO] aponta para o mesmo objeto apontado por aponta para o mesmo objeto apontado por objClasseobjClasse // não há necessidade de atualização// não há necessidade de atualização ifif((thisthis..[ATRIBUTO][ATRIBUTO] == == objClasseobjClasse)) returnreturn;; // Se o parâmetro é // Se o parâmetro é nullnull, isto indica que os vínculos devem ser removidos, isto indica que os vínculos devem ser removidos ifif((objClasseobjClasse == == nullnull)) {{ [CLASS[CLASSE_APONTADA] E_APONTADA] antigo = antigo = thisthis..[ATRIBUTO][ATRIBUTO];; // Apago a referência antiga// Apago a referência antiga thisthis..[ATRIBUTO][ATRIBUTO] = = nullnull;; 46 C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - // Solicito ao objeto antigo que deixe de referenciar o // Solicito ao objeto antigo que deixe de referenciar o thisthis.. antigo.antigo.removeremove[CLASSE][CLASSE]((thisthis); ); OUOU antigo.setantigo.set[CLASSE][CLASSE]((nullnull););}} elseelse {{ // Se o // Se o thisthis jjá á apontavaapontava parapara um um objetoobjeto de de [CLASS[CLASSE_APONTADA]E_APONTADA], , // vamos fazer a remoção do vínculo antigo // vamos fazer a remoção do vínculo antigo ifif((thisthis..[ATRIBUTO][ATRIBUTO] != != nullnull)) thisthis..[ATRIBUTO][ATRIBUTO]..removeremove[CLASSE][CLASSE]((thisthis); ); OUOU thisthis..[ATRIBUTO][ATRIBUTO].set.set[CLASSE][CLASSE]((nullnull);); // Estabeleço a referência// Estabeleço a referência thisthis..[ATRIBUTO][ATRIBUTO] = = objClasseobjClasse;; // solicito ao // solicito ao objClasseobjClasse para referenciar o para referenciar o thisthis.. objClasseobjClasse..addadd[CLASSE][CLASSE]((thisthis); ); OUOU objClasseobjClasse.set.set[CLASSE][CLASSE]((thisthis);); }} }} 1 7 / 0 8 / 2 0 1 3 1 7 / 0 8 / 2 0 1 3 Estabelecimento de RelacionamentosEstabelecimento de Relacionamentos ResumoResumo TOTO publicpublic voidvoid addadd[CLASS[CLASSE_APONTADA]E_APONTADA](([CLASS[CLASSE_APONTADA]E_APONTADA] novo)novo) {{ // Se a referência já está presente na lista de // Se a referência já está presente na lista de [CLASS[CLASSE_APONTADA]E_APONTADA] // não há necessidade de atualização// não há necessidade de atualização ifif((thisthis.lista.lista[CLASS[CLASSE_APONTADA]E_APONTADA]s.s.containscontains(novo))(novo)) returnreturn;; // Adicionando a referência na lista// Adicionando a referência na lista[CLASS[CLASSE_APONTADA]E_APONTADA]ss thisthis.lista.lista[CLASS[CLASSE_APONTADA]E_APONTADA]s.s.addadd(novo);(novo); // Solicito a adição da referência no sentido inverso// Solicito a adição da referência no sentido inverso novo.novo.setset[CLASSE][CLASSE]((thisthis); ); OUOU novo.novo.addadd[CLASSE][CLASSE]((thisthis);); 47 C o l e ç õ e s e V i s i b i l i d a d e C o l e ç õ e s e V i s i b i l i d a d e - - A l e s s a n d r o C e r q u e i r a A l e s s a n d r o C e r q u e i r a - - novo.novo.setset[CLASSE][CLASSE]((thisthis); ); OUOU novo.novo.addadd[CLASSE][CLASSE]((thisthis);); }} publicpublic voidvoid removeremove[CLASS[CLASSE_APONTADA]E_APONTADA](([CLASS[CLASSE_APONTADA]E_APONTADA] antigo)antigo) {{ // Se a referência antiga já não está presente na lista // Se a referência antiga já não está presente na lista // não há necessidade de atualização// não há necessidade de atualização ifif( ( !! thisthis.lista.lista[CLASS[CLASSE_APONTADA]E_APONTADA]s.s.containscontains(antigo))(antigo)) returnreturn;; // Removendo a // Removendo a refer~enciarefer~encia antigaantiga thisthis.lista.lista[CLASS[CLASSE_APONTADA]E_APONTADA]s.s.removeremove(antigo);(antigo); // Solicito a remoção da referência no sentido inverso// Solicito a remoção da referência no sentido inverso antigo.antigo.setset[CLASSE][CLASSE]((nullnull); ); OUOU antigo.removeantigo.remove[CLASSE][CLASSE]((thisthis); ); }}
Compartilhar