Aula 9: Igualdade entre objetos, Cópia de objetos e Visões

Tamanho: px
Começar a partir da página:

Download "Aula 9: Igualdade entre objetos, Cópia de objetos e Visões"

Transcrição

1 Aula 9: Igualdade entre objetos, Cópia de objetos e Visões 9.1 O Contrato da Classe Object Toda classe estende a classe Object e, portanto, herda também todos os seus métodos. Dois destes métodos são particularmente importantes, pois geram conseqüências em todos os programas. O método para teste de igualdade: public boolean equals (Object o) e o método para geração de código hash: public int hashcode () Como quaisquer outros métodos de uma superclasse, estes métodos podem ser sobrepostos. Veremos em uma aula próxima, sobre tipagem, que uma subclasse deveria ser um subtipo. Isto significa que ela deveria se comportar de acordo com a especificação da superclasse, de forma que um objeto da subclasse possa ser utilizado em um contexto no qual um objeto da superclasse é esperado, funcionando apropriadamente. A especificação da classe Object é um tanto abstrata e pode ser considerada confusa. Mas a não conformidade com sua especificação pode ocasionar terríveis conseqüências, resultando em bugs complexos e obscuros. Ainda pior, se você não compreender esta especificação e suas ramificações, você poderá estar introduzindo falhas no seu código, falhas profundas e difíceis de serem eliminadas sem um trabalho duro. A especificação da classe Object é tão importante que muitas vezes é referenciada como O Contrato da classe Object, ou contrato de objeto. O contrato pode ser encontrado nas especificações dos métodos equals e hashcode na documentação da API Java. Onde é estabelecido o seguinte: equals deve estabelecer uma relação de equivalência - isto é, uma relação que é reflexiva, simétrica e transitiva; equals deve ser consistente: repetidas chamadas ao método devem gerar o mesmo resultado, a não ser quando os argumentos são modificados; para uma referência não nula x, x.equals(null) deve retornar false; hashcode deve produzir o mesmo resultado para dois objetos considerados iguais pelo método equals; 99

2 9.2 Propriedades de Igualdade Vamos olhar primeiro nas propriedades do método equals. Serreflexivo significa que um dado objeto será sempre igual a si mesmo; simetria significa que quando a equals b, b equals a; transitividade significa que quando a equals b e b equals c, a equals c. Estas propriedades podem parecer óbvias, e de fato são. Mas se elas não forem válidas, é difícil imaginar como o método equals poderia ser utilizado: seria preciso preocupar-se com a correta escrita do método: a.equals(b) ou b.equals(a), por exemplo, caso a simetria não fosse uma propriedade válida. Mas menos óbvio, no entanto, é o quão fácil essas propriedades podem ser quebradas inadvertidamente. O seguinte exemplo (extraído do excelente Effective Java: Programming Language Guide, de Joshua Bloch's, um dos textos recomendados pelo curso) mostra como a simetria e a transitividade podem ser quebradas quando utilizamos herança. Considere uma simples classe que implementa um ponto bi-dimensional: public class Point { private final int x; private final int y; public Point (int x, int y) { this.x = x; this.y = y; public boolean equals (Object o) { if (!(o instanceof Point)) return false; Point p = (Point) o; return p.x == x && p.y == y; Agora considere que adicionamos a noção de cor: public class ColourPoint extends Point { private Colour colour; public ColourPoint (int x, int y, Colour colour) { 100

3 super (x, y); this.colour = colour; Como deve ser o método equals da classe ColourPoint? Poderíamos apenas herdar o método equals de Point, mas dessa forma dois objetos ColourPoint seriam considerados iguais mesmo que tivessem cores diferentes. Poderíamos sobrepor o método da seguinte forma: public boolean equals (Object o) { if (!(o instanceof ColourPoint)) return false; ColourPoint cp = (ColourPoint) o; return super.equals (o) && cp.colour.equals(colour); Este método, aparentemente inofensivo, viola a exigência da simetria. Para ver o porquê, considere um ponto Point e um ponto colorido ColourPoint: Point p = new Point (1, 2); ColourPoint cp = new ColourPoint (1, 2, Colour.RED); Agora p.equals(cp) retorna true, mas cp.equals(p) retorna false! O problema é que estas duas expressões utilizam diferentes métodos equals: a primeira utiliza o método da classe Point, que ignora cor, e o segundo utiliza o método da classe ColourPoint. Poderíamos tentar consertar este problema fazendo com que o método da classe ColourPoint ignore a cor quando a comparação é realizada com um ponto que não é colorido: public boolean equals (Object o) { if (!(o instanceof Point)) return false; // se o é um Point normal, utilize a comparação sem considerar cor if (!(o instanceof ColourPoint)) return o.equals (this); ColourPoint cp = (ColourPoint) o; return super.equals (o) && cp.colour.equals (colour); 101

4 O que resolve o problema da simetria, mas agora temos um problema de transitividade! Para ver o porquê, considere a construção destes pontos: ColourPoint p1 = new ColourPoint (1, 2, Colour.RED); Point p2 = new Point (1, 2); ColourPoint p3 = new ColourPoint (1, 2, Colour.BLUE); As chamadas p1.equals(p2) e p2.equals(p3) irão ambas retornar true, mas p1.equals(p3) irá retornar false. Desta forma parece que não há solução para o problema: trata-se de um problema fundamental da utilização de herança. Não se pode escrever um bom método equals para ColourPoint, casoesta classe seja herdeira de Point. No entanto, se você implementar ColourPoint utilizando Point em sua representação, de maneira que um ColourPoint não seja mais tratado como um Point, o problema desaparece. Veja o livro de Bloch para mais detalhes. O livro de Bloch também dá boas dicas sobre como escrever um bom método equals, apontando alguns erros muito comuns. Por exemplo, o que acontece se você escreve alguma coisa parecida com isto: public boolean equals (Point p) Isto é, utilizando um outro tipo que não Object na declaração do método equals? 9.3 Hashing Para compreender a parte do contrato de objeto relacionada ao método hashcode, você deverá saber alguma coisa a respeito de como uma tabela hash funciona. As tabelas hash são uma invenção fantástica - uma das melhores idéias da ciência da computação. Uma tabela hash é uma representação de um mapeamento: um tipo abstrato de dado que mapeia chaves para valores. As tabelas hash oferecem tempo constante de busca e, portanto, possuem um desempenho melhor do que as árvores ou listas. As chaves não precisam estar ordenadas, ou possuírem qualquer propriedade particular, exceto oferecerem os métodos equals e hashcode. Agora mostraremos como uma tabela hash funciona. Ela possui um array inicialisado com um tamanho correspondente ao número de elementos que esperamos inserir. Quando uma chave e um valor são apresentados para inserção, computamos o valor hash (ou código hash) da chave, e 102

5 convertermos este código para um índice dentro do intervalo abrangido pelo array (por exemplo, através da operação módulo de divisão). O valor, então, é inserido naquele índice. A invariante rep de uma tabela hash inclui a restrição fundamental de que as chaves devem ser inseridas nas posições determinadas pelos seus respectivos códigos hash. Veremos mais adiante por que isso é importante. Os códigos hash são projetados de forma que as chaves sejam distribuídas igualmente ao longo dos índices. Mas, ocasionalmente ocorrem conflitos, e duas chaves são colocadas no mesmo índice. Então, ao invés de armazenar um único valor em um índice, a tabela hash armazena em cada posição de seu índice uma lista de pares chave/valor (normalmente denominados 'hash buckets'). Durante a inserção, insere-se um destes pares na lista correspondente à posição determinada pelo código hash. Durante a operação de busca, aplica-se a função hash sobre o elemento de busca para que se recupere seu código hash, encontra-se a posição correta no array, e examinam-se cada um dos pares alocados na lista daquela posição até que se encontre a chave procurada. Agora deve estar claro o porquê da exigência de que objetos iguais tenham o mesmo código hash. Se dois objetos que são iguais possuem códigos diferentes, eles podem ser colocados em posições diferentes. Então, se tentarmos fazer uma busca utilizando a chave utilizada na operação de inserção do par chave/valor, a busca pode falhar. Uma maneira simples e drástica para se garantir que o contrato de objeto é satisfeito pelo método hashcode, é fazer com que este método retorne sempre um valor constante, de maneira que todo objeto tenha o mesmo código hash. Esta medida satisfaz o contrato de objeto, mas resultaria em um desastre de performance, pois toda chave seria armazenada na mesma posição, e toda busca seria realizada linearmente ao longo de uma lista. A maneira padrão de se construir um código hash mais adequado, e que ainda satisfaz o contrato, é computar o código hash para cada componente (propriedade do objeto) utilizado na determinação de igualdade do objeto. Normalmente, procede-se chamando o método hashcode de cada componente, combinando cada código conseguido através de algumas operações aritméticas. Refira-se ao livro de Bloch para mais detalhes. Ainda mais crucial, perceba que se você não sobrepor o método hashcode, você estará utilizando a versão do método da classe Object, que é baseada no endereço do objeto. Caso você tenha sobreposto o método equals, é quase certeza que você violou o contrato. Então, como uma regra geral: Sempre sobreponha o método hashcode quando você sobrepor o método equals. 103

6 Esse é um dos aforismos de Bloch. Todo o livro é uma coleção de aforismos como este, cada um dos quais explicado e ilustrado. Ano passado, um estudante dedicou horas tentando descobrir um bug em um projeto que foi escrito com um pequeno erro: ao invés de hashcode, foi utilizado o termo hashcode. Como resultado, foi criado um método que não sobrepôs o método hashcode da classe Object, fazendo com que coisas estranhas acontecessem. (o Java é sensível ao caso). Esta é uma outra razão para se evitar a utilização do recurso de herança Copiando Objetos Muitas vezes surge a necessidade de se fazer a cópia de um objeto. Por exemplo, você pode querer realizar uma computação que altera um objeto, mas deseja que outros objetos que já fazem referência a este objeto não sejam afetados. Ou, em um outro caso, você pode ter um objeto protótipo a partir do qual você quer criar uma coleção de objetos que diferem sutilmente, sendo conveniente fazer cópias deste protótipo para modificá-las. As pessoas às vezes falam a respeito de cópias 'rasas' e de cópias 'profundas'. Uma cópia rasa de um objeto é conseguida criando-se um novo objeto cujos campos apontam para os mesmos objetos para os quais o objeto original apontava. Uma cópia profunda é conseguida criando-se, também, um novo objeto para cada um dos objetos apontados pelos campos do objeto original e, talvez, para os objetos para os quais estes objetos apontam, e assim por diante. Como a cópia deve ser feita? Se você foi estudioso e consultou a API Java, você pode supor que será necessário utilizar o método clone da classe Object, junto com a interface Cloneable. Istoé tentador, pois Cloneable é um tipo especial de interface que adiciona funcionalidades mágicas a uma classe. Infelizmente, no entanto, o projeto desta parte do Java não está muito correta, sendo muito difícil utilizá-la corretamente. Portanto, eu recomendo que você não a utilize, a menos que seja obrigado (por exemplo, quando o código que você está utilizando requer que se implemente Cloneable, ou porque seu gerente não participou do curso 6170). Consulte o livro de Bloch para uma interessante discussão dos problemas relacionados. Você pode achar que é bom declarar um método desta forma: class Point { Point copy () { 104

7 Preste atenção ao tipo de retorno: a cópia de um Point deve resultar em um Point. Mas em uma subclasse, você gostaria que o método copy retornasse umobjeto da subclasse: class ColourPoint extends Point { ColourPoint copy () { Infelizmente, isto não é permitido em Java. Você não pode alterar o tipo de retorno de um método quando sobrepô-lo em uma subclasse. E a sobrecarga de nomes de métodos permite apenas a alteração dos tipos dos argumentos. Portanto, você seria forçado a declarar ambos os métodos da seguinte forma: Object copy () Isto é um incômodo, pois será necessário fazer uma operação de downcast paraquesepossa trabalhar com o tipo correto. Mas este recurso funciona, e algumas vezes é a coisa certa a se fazer. Existem duas outras formas de se fazer uma cópia. Uma delas é utilizar um método estático conhecido como método 'factory', ou método de fabricação, pois cria novos objetos: public static Point newpoint (Point p) A outra forma é fornecer construtores adicionais, normalmente denominados 'copy constructors', ou 'construtores de cópia'. public Point (Point p) Ambas as formas funcionam muito bem, embora não sejam perfeitas. Você não pode colocar métodos estáticos ou construtores em uma interface, portanto, essas alternativas não são perfeitas quando você quer promover funcionalidades genéricas. A abordagem do construtor de cópia é amplamente utilizada na API do Java. Uma característica interessante dessa abordagem é que ela permite que o cliente escolha a classe do objeto a ser criado. O argumento para o construtor de 105

8 cópia é muitas vezes declarado como tendo o tipo de uma interface, de maneira que você possa passar para o construtor qualquer tipo de objeto que implemente a interface. Todas as classes de coleção do Java, por exemplo, fornecem um construtor de cópia que recebe um argumento do tipo Collection ou Map. Se você pretende criar um ArrayList apartirdeumlinkedlist l, por exemplo, seria preciso apenas chamar new ArrayList (l) 9.5 Igualdade de Elementos e igualdade de Containers Containers são objetos que, fundamentalmente, armazenam referências para outros elementos ou objetos. Por exemplo, os tipos List e derivados são containers. Quando dois objetos do tipo container são iguais? Se eles são imutáveis, eles devem ser iguais se contiverem os mesmos elementos. Por exemplo, duas strings devem ser iguais se elas contêm os mesmos caracteres (na mesma ordem). Se apenas mantivermos o método padrão de igualdade da classe Object, uma string inserida através do teclado, por exemplo, nunca seria igual a uma string que está em uma lista ou uma tabela, pois seria um novo objeto string (uma outra instância) e, portanto, não seria o mesmo objeto. De fato, é exatamente assim que o método equals é implementado na classe String do Java, e se você quer saber se duas strings s1 e s2 contêm a mesma seqüência de caracteres, você deverá escrever: s1.equals (s2) enão s1 == s2 A segunda linha de código do exemplo acima irá retornar falso quando s1 e s2 representarem diferentes objetos string, mesmo que contenham a mesma seqüência de caracteres O Problema Chega de strings ou seqüências de caracteres. Vamos considerar agora as listas, que são seqüências de objetos arbitrários. As listas devem ser consideradas da mesma forma que as strings, de forma que duas listas são iguais se elas contiverem os mesmos elementos na mesma ordem? 106

9 Suponha que estou planejando uma festa na qual meus amigos irão se sentar em várias mesas diferentes, e que escrevi um programa para me ajudar a estabelecer o planejamento. Eu represento cada mesa como uma lista de amigos, e a festa inteira como um conjunto de listas do tipo HashSet. O programa se inicia criando listas vazias para as mesas e inserindo estas listas ao conjunto de mesas: List t1 = new LinkedList (); List t2 = new LinkedList (); Set s = new HashSet (); s.add (t1); s.add (t2); Em algum momento mais tarde, o programa irá adicionar amigos às várias listas; podendo, também, criar novas listas e substituir listas existentes no conjunto por estas novas listas. Finalmente, o programa realiza uma iteração sobre o conjunto de mesas imprimindo cada uma das listas. Este programa irá falhar, pois as inserções iniciais não surtirão o efeito esperado. Mesmo que as listas vazias representem conceitualmente mesas distintas, de acordo com o método equals de LinkedList, elas serão iguais. Pois a classe Set aplica o método equals sobre seus elementos afim de rejeitar duplicatas. Portanto, todas as inserções, menos a primeira, não surtirão nenhum efeito, pois todasaslistasvaziasserãoencaradascomoduplicatas. Como solucionar este problema? Você pode imaginar que Set deveria ter utilizado == para checar por duplicatas, ao invés de equals. Desta maneira, um objeto será considerado uma duplicata apenas seéexatamenteaqueleobjeto(amesmainstância)quejáestánoconjunto. É interessante observar que, embora resolva o problema acima, esta abordagem não funciona para strings; isto significa que após Set Set = new HashSet (); String lower = "hello"; String upper = "HELLO"; Set.add (lower.touppercase()); O testeset.contains(upper) iria retornar false, pois o método touppercase cria uma nova string. 107

10 9.5.2 A Solução de Liskov No texto de nosso curso, Liskov apresenta uma solução sistemática para o problema. Você deve fornecer dois métodos distintos: equals que retorna true quando dois objetos de uma classe possuem comportamento equivalente e, similar, que retorna true quando dois objetos podem ser observados como equivalentes. Aqui está a diferença. Dois objetos possuem comportamento equivalente senão existe uma seqüência de operações que possa distingüí-los. Nestes termos, as listas vazias t1 e t2 do exemplo acima não são equivalentes, pois se você inserir um elemento em uma delas, você pode observar que uma é alterada, mas a outra não. Mas duas strings distintas que contêm a mesma seqüência de caracteres são equivalentes no comportamento, pois você não pode modificá-las e, portanto, não pode descobrir que são objetos diferentes (estamos assumindo que você não pode utilizar == neste experimento). Dois objetos podem ser observados como equivalentes, ou seja, eles possuem uma equivalência observacional, se você não puder identificar a diferença entre eles utilizando operações do tipo observadoras (e não operações do tipo modificadoras). Nestes termos, as listas vazias t1 e t2 do exemplo acima são equivalentes, pois possuem mesmo tamanho, contêm os mesmos elementos, etc. Desta forma duas strings que contêm a mesma seqüência de caracteres são, também, equivalentes. Mostraremos agora como você pode codificar equals e similar. Para um tipo mutável, você simplesmente herda o método equals da classe Object, e escreve um método similar que realiza uma comparação campo a campo. Para um tipo imutável, você deve sobrepor o método equals com um método que realiza a comparação campo a campo, e deve fazer com que similar invoque equals de maneira que eles sejam o mesmo método (similar se torna umwrapper de equals). Esta solução, quando aplicada uniformemente, é de fácil compreensão e funciona bem. Mas nem sempre é ideal. Suponha que você queira escrever um código que utiliza o padrão de projeto Interning, que será visto na aula 12. Este padrão determina que se você possui referências a objetos estruturalmente idênticos, deve-se alterar sua estrutura de dados de forma que as referências para estes objetos apontem para exatamente a mesma instância do objeto, descartando as instâncias de maneira que reste apenas uma (o representante canônico). Isto é muitas vezes utilizado em compiladores; os objetos podem ser variáveis de programas, por exemplo, e você deseja que todas as referências para uma variável particular da árvore de sintaxe abstrata apontem para o mesmo objeto, assim, qualquer informação que você armazene a respeito desta variável (alterando o objeto) é efetivamente propagada para todos os locais onde esta variável aparece. 108

11 Para armazenar e controlar os objetos, você pode tentar utilizar uma tabela hash. Toda vez que você encontrar um novo objeto na estrutura de dados, você deve procurar este objeto na tabela para verificar se ele possui um representante canônico. Se possuir o representante, você deve substituir o objeto pelo seu representante; do contrário, se não houver um representante, você deve inserí-lo na tabela hash de forma que ele seja, ao mesmo tempo, chave e valor. Segundo a abordagem de Liskov, esta estratégia iria falhar, pois o teste de igualdade sobre as chaves nunca encontraria uma correspondência para objetos distintos que são estruturalmente equivalentes, pois o método equals de um objeto mutável só retorna true quando se trata, exatamente, do mesmo objeto A Abordagem Java Por razões como esta, o projetista da API de coleções do Java não seguiu esta abordagem. Não existe ummétodo similar, e o método equals refere-se à equivalência observacional. Este fato pode causar algumas conseqüências convenientes como, por exemplo, a tabela hash de armazenagem irá funcionar. Mas também possui algumas conseqüências infortúnias. O programa de planejamento de festa do exemplo da seção não irá funcionar, pois duas listas distintas vazias serão consideradas iguais, como já foi apontado. Na especificação da classe List do Java, duas listas são iguais não apenas se elas contêm os mesmos elementos na mesma ordem, mas apenas se elas contêm elementos iguais segundo o método equals, e na mesma ordem. Em outras palavras, o método equals é chamado recursivamente para todos os elementos armazenados. Para manter o contrato de objeto, o método hashcode também é chamado recursivamente sobre os elementos. O que ocasiona uma surpresa desagradável. O seguinte código, no qual uma lista é inserida em si mesma, irá falhar, pois nunca será concluído, ou seja, nunca irá terminar! List l = new LinkedList (); l.add (l); int h = l.hashcode (); Esta é a razão pela qual você irá encontrar avisos na documentação da API Java a respeito da inserção de objetos containers neles próprios, veja, por exemplo, este comentário da especificação da classe List: 109

12 Nota: ao passo que é permitido que as listas contenham a si próprias como elementos, é feito um aviso para tomada de extrema cautela: os métodos equals e hashcode não mais estão bem definidos neste tipo de lista. Existem outras conseqüências, ainda mais delicadas, decorrentes da abordagem Java. São conseqüências a respeito da exposição de representação. Como será explicado mais adiante. Este fato lhe deixa com duas opções, ambas as quais são aceitas pelas idéias do curso 6170: Você pode seguir a abordagem Java, na qual você terá os benefícios de sua conveniência, mas terá que lidar com as complicações que podem surgir. Alternativamente, você pode seguir a abordagem de Liskov, mas nesse caso você terá que descobrir como incorporar as classes de coleções do Java no seu código (com LinkedList e HashSet). Em geral, quando você tem quem incorporar uma classe da qual o método equals segue uma abordagem diferente do programa como um todo, você pode escrever um wrapper paraaclassea ser incorporada para substituir o método equals por um mais adequado. O texto do curso dá um exemplo de como fazer isso. 9.6 Exposição de Rep Vamos rever o exemplo da exposição de rep com o qual encerramos a última aula. Lá imaginamos uma variante de LinkedList para representar seqüências sem duplicatas. A operação add foi definida como possuindo uma especificação que determina que um elemento só é adicionado caso este elemento não seja uma duplicata, sendo que o código do método add deve realizar esta checagem. void add (Object o) { if (contains (o)) return; else // adiciona o elemento Devemos registrar, no topo do arquivo, a determinação da invariante rep, isto é, um aviso dizendo que a lista não contém duplicatas: 110

13 A lista não contém duplicatas. Ou seja, não existem duas entradas (objetos Entry) distintas e1 e e2 tais que e1.element.equals (e2.element). Para verificamos que esta propriedade é preservada, devemos nos certificar que todo método que adiciona um elemento, primeiro realiza uma checagem. Infelizmente, esta não é uma boa idéia. Veja o que acontece se construímos uma lista de listas e alteramos um dos elementos lista: List x = new LinkedList (); List y = new LinkedList (); Object o = new Object (); x.add (o); List p = new LinkedList (); p.add (x); p.add (y); x.remove (o); Após esta seqüência de código, a invariante rep de p é quebrada. O problema é que a alteração em x o torna igual a y, pois ambos são listas vazias. O que está acontecendo aqui? O contorno de invariante que passamos ao redor da representação inclui a classe do elemento, pois a invariante rep depende de uma propriedade do elemento (veja a figura). Perceba que este problema não teria surgido se a igualdade tivesse sido determinada pela abordagem de Liskov, pois dois elementos mutáveis seriam iguais apenas se eles fossem exatamente o mesmo objeto: o contorno se estende apenas até a referência do elemento, e não até o elemento propriamente dito. 111

14 9.6.1 Alterando Chaves Hash Um exemplo mais comum e com maior ocorrência deste fenômeno ocorre com chaves hash. Se você alterar um objeto depois que ele foi inserido como uma chave de uma tabela hash, pode ocorrer que seu código hash seja alterado. Como resultado, a invariante rep crucial da tabela hash - aquela que determina que as chaves estão armazenadas nas posições especificadas pelos seus respectivos códigos hash - é quebrada. Aqui temos um exemplo. Um conjunto hash pode ser entendido como um conjunto implementado sobre uma tabela hash: imagine este conjunto como uma tabela hash com chaves, mas nenhum valor. Se inserirmos uma lista vazia no conjunto hash e, então, inserirmos um elemento na lista da seguinte forma: Set s = new HashSet (); List x = new LinkedList (); s.add (x); x.add (new Object ()); Uma chamada subseqüente s.contains(x) provavelmente irá retornar false. Se você considera isto aceitável, considere o fato de que agora não existe nenhum valor x para o qual s.contains(x) retorna true, mesmo que s.size() retorne 1! Novamente, o problema é exposição de representação: o contorno ao redor da tabela hash inclui as chaves. A lição que tiramos disso é: ou você segue a abordagem de Liskov, que utiliza um wrapper para sobrepor o método equals da lista do Java, ou certifica-se de que nunca irá alterar a chaves hash. Do contrário você pode permitir qualquer alteração de um elemento, mas estará correndo o risco de quebrar a invariante rep do container no qual o elemento está inserido. Esta é a razão pela qual você verá comentários como este na especificação da API Java: Nota: muito cuidado deve ser tomado com objetos mutáveis que são utilizados como elementos de um conjunto. O comportamento de um conjunto torna-se indefinido caso o valor de um objeto seja alterado de maneira que a alteração afete as comparações de igualdade enquanto este objeto for um elemento do conjunto. Um caso especial de proibição é: não é permitido que um conjunto contenha a si mesmo como um elemento. 112

15 9.7 Visões Uma prática cada vez mais comum na programação orientada a objetos é ter-se objetos distintos que oferecem diferentes tipos de acesso para a mesma estrutura de dados subjacente. Tais objetos são denominados views, ou visões. Normalmente um objeto é chamado de primário, e um outro de secundário. O objeto primário é chamado de objeto 'underlying', ou subjacente; e o objeto secundário é chamado de 'view', ou visão. Estamos acostumados com a utilização de aliasing, isto é, existem duas (ou mais) referências com nomes distintos para o mesmo objeto, de forma que uma alteração no objeto acessado via uma das referências aparece como uma alteração para a outra referência: List x = new LinkedList (); List y = x; x.add (o); // altera y também As visões são problemáticas, pois elas envolvem uma forma delicada de aliasing, na qual os dois objetos possuem tipos distintos. Nós vimos um exemplo destes com iteradores, cujo método remove de um iterador remove da coleção subjacente o último elemento inserido: List x = new LinkedList (); Iterator i = x.iterator (); while (i.hasnext ()) { Object o = i.next (); i.remove (); //altera x também Um iterador pode ser considerado como uma visão da coleção subjacente. Aqui temos dois outros exemplos de visões da API de coleções do Java. Para que se consiga um método keyset que retorna um conjunto de chaves de um objeto Map, é exigido que se implemente a interface Map. Este conjunto é uma visão; pois se o objeto Map subjacente for alterado, o conjunto retornado por keyset será alterado de forma semelhante. Diferente de um iterador, esta visão e o objeto subjacente podem, ambos, serem modificados; deletar-se uma chave do conjunto irá fazer com que a chave e seu valor sejam deletados do objeto Map. O conjunto não suporta uma operação add, pois não haveria sentido em se 113

16 adicionar uma chave sem um valor. (isto, por acaso, é a razão pela qual os métodos add e remove são métodos opcionais da interface Set). A classe List possui um método sublist que retorna uma visão de parte da lista. A visão retornada pelo método sublist pode ser usada para se acessar a lista com o auxílio de um offset, eliminando a necessidade de operações explícitas sobre o intervalo de índices. Qualquer método sobre o intervalo de índices da lista subjacente, e que espera uma lista como argumento, pode ser utilizado passando-se apenas uma visão na forma de uma sublista, ao invés da lista toda. Por exemplo, o seguinte código remove um intervalo de elementos de uma lista: List.subList(from, to).clear(); Idealmente, uma visão e seu objeto subjacente deveriam ser, ambos, modificáveis com os efeitos decorrentes das modificações sendo, perfeitamente, propagados entre os dois. Infelizmente, isto não é sempre possível, muitas visões determinam restrições sobre as quais, alguns tipos de alterações são impossíveis. Um iterador, por exemplo, se torna inválido se a coleção subjacente for modificada durante a iteração. Uma sublista é invalidada por certas alterações estruturais ocorridas na lista subjacente. As coisas ficam ainda mais complicadas quando existem diversas visões do mesmo objeto. Por exemplo, se você tem dois iteradores simultaneamente sobre a mesma coleção subjacente, uma modificação sobre um iterador (através de uma chamada ao método remove) irá invalidar o outro iterador (mas não a coleção). 9.8 Resumo Os tópicos a respeito de igualdade entre objetos, cópia de objetos e visões demonstram o poder da programação orientada a objetos, mas também demonstram suas armadilhas. Você deve utilizar um tratamento sistemático e uniforme durante a utilização de igualdade, durante a utilização de hashing e durante as operações de cópia em qualquer programa que você escreva. As visões são um mecanismo muito útil, mas devem ser utilizadas cuidadosamente. A construção de um modelo de objeto para o seu programa é outra prática útil, pois o modelo irá lembrar você dos locais onde ocorre compartilhamento fazendo com que você examine cada caso com muito cuidado. 114

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo. Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade Page 1 podem ser comparadas com arrays, visto que também apresentam a capacidade de armazenar referências para vários objetos. Entretanto, as coleções apresentam uma gama de funcionalidades bem maior do

Leia mais

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008 Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,

Leia mais

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education Java Como Programar, 8/E Slide 1 Slide 2 Slide 3 Métodos genéricos e classes genéricas (e interfaces) permitem especificar, com uma única declaração de método, um conjunto de métodos relacionados ou, com

Leia mais

Guia de Fatores de Qualidade de OO e Java

Guia de Fatores de Qualidade de OO e Java Qualiti Software Processes Guia de Fatores de Qualidade de OO e Java Versã o 1.0 Este documento só pode ser utilizado para fins educacionais, no Centro de Informática da Universidade Federal de Pernambuco.

Leia mais

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS Coleções Conceitos e Utilização Básica c Professores de ALPRO I Faculdade de Informática PUCRS 05/2012 ALPRO I (FACIN) Coleções: Básico 05/2012 1 / 41 Nota Este material não pode ser reproduzido ou utilizado

Leia mais

Modulo IIa Extra: Object

Modulo IIa Extra: Object Modulo IIa Extra: Object Professor Ismael H F Santos ismael@tecgraf.puc-rio.br April 05 Prof. Ismael H. F. Santos - ismael@tecgraf.puc-rio.br 1 Bibliografia Linguagem de Programação JAVA Ismael H. F. Santos,

Leia mais

Computação II Orientação a Objetos

Computação II Orientação a Objetos Computação II Orientação a Objetos Fabio Mascarenhas - 2014.1 http://www.dcc.ufrj.br/~fabiom/java Classes abstratas Até agora, usamos interfaces toda vez que queríamos representar algum conceito abstrato

Leia mais

Aula 16: Estudo de Caso: A API de Coleções do Java

Aula 16: Estudo de Caso: A API de Coleções do Java Aula 16: Estudo de Caso: A API de Coleções do Java Você não pode ser um programador Java competente sem compreender as partes cruciais da biblioteca Java. Os tipos básicos estão todos em java.lang, e são

Leia mais

Prototype, um Design Patterns de Criação

Prototype, um Design Patterns de Criação Prototype, um Design Patterns de Criação José Anízio Pantoja Maia Este artigo tem como finalidade compreender o funcionamento do padrão de projeto prototype, serão abordados os participantes que compõe

Leia mais

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 07: Funções O comando return Protótipo de funções O tipo void Arquivos-cabeçalho Escopo de variáveis Passagem de parâmetros por valor

Leia mais

Java 2 Standard Edition Como criar classes e objetos

Java 2 Standard Edition Como criar classes e objetos Java 2 Standard Edition Como criar classes e objetos Helder da Rocha www.argonavis.com.br 1 Assuntos abordados Este módulo explora detalhes da construção de classes e objetos Construtores Implicações da

Leia mais

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br ROTEIRO 5. Tratamento de Exceções Introdução e conceitos Capturando exceção usando

Leia mais

Técnicas de Programação II

Técnicas de Programação II Técnicas de Programação II Aula 06 Orientação a Objetos e Classes Edirlei Soares de Lima Orientação a Objetos O ser humano se relaciona com o mundo através do conceito de objetos.

Leia mais

Implementando uma Classe e Criando Objetos a partir dela

Implementando uma Classe e Criando Objetos a partir dela Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 04 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 2 Prof. Cristóvão Cunha Implementando uma Classe

Leia mais

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS Campus Cachoeiro de Itapemirim Curso Técnico em Informática Disciplina: Análise e Projeto de Sistemas Professor: Rafael Vargas Mesquita Este exercício deve ser manuscrito e entregue na próxima aula; Valor

Leia mais

Programação Orientada a Objetos em Java. Herança

Programação Orientada a Objetos em Java. Herança Universidade Federal do Amazonas Departamento de Ciência da Computação IEC481 Projeto de Programas Programação Orientada a Objetos em Java Herança Professor: César Melo Slides baseados em materiais preparados

Leia mais

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 06: Ponteiros Declarando e utilizando ponteiros Ponteiros e vetores Inicializando ponteiros Ponteiros para Ponteiros Cuidados a serem

Leia mais

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução:

Leia mais

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS ATRIBUTOS PRIVADOS Podemos usar o modificador private, para tornar um atributo privado, obtendo um controle centralizado Definimos métodos para implementar todas as lógicas que utilizam ou modificam o

Leia mais

Disciplina: Unidade III: Prof.: E-mail: Período:

Disciplina: Unidade III: Prof.: E-mail: Período: Encontro 08 Disciplina: Sistemas de Banco de Dados Unidade III: Modelagem Lógico de Dados Prof.: Mario Filho E-mail: pro@mariofilho.com.br Período: 5º. SIG - ADM Relembrando... Necessidade de Dados Projeto

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Uma Árvore Binária de Busca T (ABB) ou Árvore Binária de Pesquisa é tal que ou T = 0 e a árvore é dita vazia ou seu nó contém uma chave e: 1. Todas as chaves da sub-árvore esquerda

Leia mais

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição Lista de Contas Lista de Contas: Assinatura null Quais são os métodos necessários? class ListaDeContas { void inserir (Conta c) { void retirar (Conta c) { Conta procurar (String num) { Listas de Contas:

Leia mais

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming Curso de PHP FATEC - Jundiaí A programação orientada a objetos (object-oriented oriented programming OOP) é um conjunto de técnicas t para organizar o código c em torno de entidades ou objetos representados

Leia mais

Programação por Objectos. Java

Programação por Objectos. Java Programação por Objectos Java Parte 6: Herança e Polimorfismo LEEC@IST Java 1/52 Herança revisão A herança é um mecanismo em que a subclasse constitui uma especialização da superclasse. A superclasse pode

Leia mais

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior Coleções Avançadas Programação Orientada a Objetos Java Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior Objetivos Aprender como o conceito de coleção pode ser expresso de forma genérica Examinar

Leia mais

Exercícios Teóricos Resolvidos

Exercícios Teóricos Resolvidos Universidade Federal de Minas Gerais Instituto de Ciências Exatas Departamento de Matemática Exercícios Teóricos Resolvidos O propósito deste texto é tentar mostrar aos alunos várias maneiras de raciocinar

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguinte propriedade: Para todo nó da árvore, se seu valor é X, então: Os nós pertencentes

Leia mais

Sistemas Operacionais. Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com

Sistemas Operacionais. Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com Sistemas Operacionais Prof. André Y. Kusumoto andrekusumoto.unip@gmail.com Estruturas de Sistemas Operacionais Um sistema operacional fornece o ambiente no qual os programas são executados. Internamente,

Leia mais

Orientação a Objetos

Orientação a Objetos Orientação a Objetos 1. Sobrecarga (Overloading) Os clientes dos bancos costumam consultar periodicamente informações relativas às suas contas. Geralmente, essas informações são obtidas através de extratos.

Leia mais

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP 1) Introdução Programação Orientada a Objetos é um paradigma de programação bastante antigo. Entretanto somente nos últimos anos foi aceito realmente

Leia mais

CURSO DE PROGRAMAÇÃO EM JAVA

CURSO DE PROGRAMAÇÃO EM JAVA CURSO DE PROGRAMAÇÃO EM JAVA Introdução para Iniciantes Prof. M.Sc. Daniel Calife Índice 1 - A programação e a Linguagem Java. 1.1 1.2 1.3 1.4 Linguagens de Programação Java JDK IDE 2 - Criando o primeiro

Leia mais

Polimorfismo. Prof. Leonardo Barreto Campos 1

Polimorfismo. Prof. Leonardo Barreto Campos 1 Polimorfismo Prof. Leonardo Barreto Campos 1 Sumário Introdução; Polimorfismo; Polimorfismo Java; Métodos Abstratos Java Classes Abstratas Java Exercício - Java Polimorfismo C++ Classe Abstrata C++; Funções

Leia mais

FÓRMULAS DO EXCEL QUE SALVARAM MEU EMPREGO

FÓRMULAS DO EXCEL QUE SALVARAM MEU EMPREGO 10 CARA DO EXCEL FÓRMULAS DO EXCEL QUE SALVARAM MEU EMPREGO O que você vai aprender neste ebook? 1. SOMA 2. CONT.NÚM 3. CONT.VALORES 4. NÚM.CARACT 5. ARRUMAR 6. DIREITA, ESQUERDA, EXT.TEXTO 7. PROCV 8.

Leia mais

UNIVERSIDADE FEDERAL DO PARANÁ

UNIVERSIDADE FEDERAL DO PARANÁ CURSO: Ciência da Computação DATA: / / 2013 PERÍODO: 4 o. PROFESSOR: Andrey DISCIPLINA: Técnicas Alternativas de Programação AULA: 05 APRESENTAÇÃO: Nesta aula vamos ver como se faz a criação de Métodos

Leia mais

HASHING. Katia Guimarães. katia@cin.ufpe.br 1

HASHING. Katia Guimarães. katia@cin.ufpe.br 1 HASHING Katia Guimarães katia@cin.ufpe.br 1 HASHING Suponha que você pudesse criar um array onde qualquer item pudesse ser localizado através de acesso direto. Isso seria ideal em aplicações do tipo Dicionário,

Leia mais

5 Caso de estudo O cartão fidelidade

5 Caso de estudo O cartão fidelidade 5 Caso de estudo O cartão fidelidade Cartão de fidelização de clientes das distribuidoras de combustível. Definição em JAVA da classe CartaoFidelidade, que deverá apresentar uma funcionalidade semelhante

Leia mais

NOVIDADES DO JAVA PARA PROGRAMADORES C

NOVIDADES DO JAVA PARA PROGRAMADORES C PROGRAMAÇÃO SERVIDOR EM SISTEMAS WEB NOVIDADES DO JAVA PARA PROGRAMADORES C Prof. Dr. Daniel Caetano 2012-1 Objetivos Apresentar o Conceito de Classes e Objetos Capacitar para a criação de objetos simples

Leia mais

Lição 9 Trabalhando com bibliotecas de classes

Lição 9 Trabalhando com bibliotecas de classes Lição 9 Trabalhando com bibliotecas de classes Introdução à Programação I 1 Objetivos Ao final da lição, o estudante deverá estar apto a: Explicar o que é programação orientada a objetos e alguns de seus

Leia mais

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO) Parte: 1 Prof. Cristóvão Cunha Objetivos de aprendizagem

Leia mais

Entendendo como funciona o NAT

Entendendo como funciona o NAT Entendendo como funciona o NAT Vamos inicialmente entender exatamente qual a função do NAT e em que situações ele é indicado. O NAT surgiu como uma alternativa real para o problema de falta de endereços

Leia mais

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES CAPÍTULO 5 5 VETORES E MATRIZES 5.1 Vetores Um vetor armazena uma determinada quantidade de dados de mesmo tipo. Vamos supor o problema de encontrar a média de idade de 4 pessoas. O programa poderia ser:

Leia mais

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Capítulo 14 Herança a e Polimorfismo Objetivos do Capítulo Apresentar os conceitos de herança e de polimorfismo. Explorar os diversos recursos disponíveis no Java para a aplicação da herança e do polimorfismo

Leia mais

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo; um objeto; é definido; Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo; class ClasseBase{ é instanciado; $objetobase = new ClasseBase; Caso queira,

Leia mais

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas

PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas PONTIFÍCIA UNIVERSIDADE CATÓLICA DE GOIÁS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas CMP1132 Processo e qualidade de software II Prof. Me. Elias Ferreira Sala: 402 E Quarta-Feira:

Leia mais

Reuso com Herança a e Composiçã

Reuso com Herança a e Composiçã Java 2 Standard Edition Reuso com Herança a e Composiçã ção Helder da Rocha www.argonavis.com.br 1 Como aumentar as chances de reuso Separar as partes que podem mudar das partes que não mudam. Exemplo:

Leia mais

Programação de Computadores - I. Profª Beatriz Profº Israel

Programação de Computadores - I. Profª Beatriz Profº Israel Programação de Computadores - I Profª Beatriz Profº Israel As 52 Palavras Reservadas O que são palavras reservadas São palavras que já existem na linguagem Java, e tem sua função já definida. NÃO podem

Leia mais

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP AULA 4 VISÃO BÁSICA DE CLASSES EM PHP Antes de mais nada, vamos conhecer alguns conceitos, que serão importantes para o entendimento mais efetivos dos assuntos que trataremos durante a leitura desta apostila.

Leia mais

Resolução da lista de exercícios de casos de uso

Resolução da lista de exercícios de casos de uso Resolução da lista de exercícios de casos de uso 1. Explique quando são criados e utilizados os diagramas de casos de uso no processo de desenvolvimento incremental e iterativo. Na fase de concepção se

Leia mais

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel. 5COP088 Laboratório de Programação Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior 1 Sumário: 1) Métodos hashcode(), equals() e tostring(); 2) Conjuntos; 3) Genéricos; 4) Resumo. 2 1)

Leia mais

Implementação de Classe e Auto-Relacionamento em Java

Implementação de Classe e Auto-Relacionamento em Java UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 1 Implementação de Classe e Auto-Relacionamento em Java 1)Introdução Um modelo de Diagrama de Classes representa a estrutura definida

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Pilhas A estrutura de dados Pilha emula a forma de organização de objetos intuitiva que é utilizada diariamente nos mais diversos contextos da vida humana. Containeres são empilhados e desempilhados diariamente

Leia mais

Engenharia de Software III

Engenharia de Software III Engenharia de Software III Casos de uso http://dl.dropbox.com/u/3025380/es3/aula6.pdf (flavio.ceci@unisul.br) 09/09/2010 O que são casos de uso? Um caso de uso procura documentar as ações necessárias,

Leia mais

Material Teórico - Módulo de Divisibilidade. MDC e MMC - Parte 1. Sexto Ano. Prof. Angelo Papa Neto

Material Teórico - Módulo de Divisibilidade. MDC e MMC - Parte 1. Sexto Ano. Prof. Angelo Papa Neto Material Teórico - Módulo de Divisibilidade MDC e MMC - Parte 1 Sexto Ano Prof. Angelo Papa Neto 1 Máximo divisor comum Nesta aula, definiremos e estudaremos métodos para calcular o máximo divisor comum

Leia mais

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos TUTORIAL Memória Flash Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006 PdP Pesquisa e Desenvolvimento de Produtos http://www.maxwellbohr.com.br contato@maxwellbohr.com.br

Leia mais

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding Introdução à Programação Interface, Polimorfismo e Dynamic Binding Interface Programador Java PLENO Possuir sólida experiência em programação Desenvolvimento na linguagem JAVA Webservice, Struts ou JSF(desejável)

Leia mais

PROGRAMAÇÃO II 4. ÁRVORE

PROGRAMAÇÃO II 4. ÁRVORE 4. ÁRVORE PROGRAMAÇÃO II Prof. Jean Eduardo Glazar Uma árvore impõe uma estrutura hierárquica em uma coleção de itens. Um exemplo familiar é a árvore genealógica. Árvores despontam de forma natural em

Leia mais

Introdução a Java. Hélder Nunes

Introdução a Java. Hélder Nunes Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais

Leia mais

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes Programação Orientada a Objetos e Java - Introdução Carlos Lopes POO e Java Objetivo: proporcionar uma visão dos conceitos de POO e do seu uso na estruturação dos programas em Java. Classes e objetos em

Leia mais

Tabela de símbolos: tabelas de espalhamento

Tabela de símbolos: tabelas de espalhamento Tabela de símbolos: tabelas de espalhamento Marcelo K. Albertini 14 de Janeiro de 2014 2/28 Resumo de complexidades Análises para operação efetuada após N inserções pior caso caso médio keys chave get

Leia mais

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Algoritmos e Estruturas de Dados II. Trabalho Prático 2 Algoritmos e Estruturas de Dados II Entrega: 24/09/08 Devolução: 15/10/08 Trabalho individual Prof. Jussara Marques de Almeida Trabalho Prático 2 Você foi contratado pela XOL X Online para desenvolver

Leia mais

Parte I. Demoiselle Mail

Parte I. Demoiselle Mail Parte I. Demoiselle Mail Para o envio e recebimento de e-s em aplicativos Java, a solução mais natural é usar a API JavaMail [http:// www.oracle.com/technetwork/java/java/index.html]. Ela provê um framework

Leia mais

BSI UFRPE Prof. Gustavo Callou gcallou@gmail.com

BSI UFRPE Prof. Gustavo Callou gcallou@gmail.com BSI UFRPE Prof. Gustavo Callou gcallou@gmail.com Coleções List Set Map Classes e interfaces do pacote java.util que representam listas, conjuntos e mapas. Solução flexível para armazenar objetos. Quantidade

Leia mais

Batalha Naval Algoritmos de Busca. Correlações curriculares Matemática: Números: maior que, menor que, iguais a.

Batalha Naval Algoritmos de Busca. Correlações curriculares Matemática: Números: maior que, menor que, iguais a. Atividade 6 Batalha Naval Algoritmos de Busca Sumário Computadores são freqüentemente requisitados a encontrar informação em grandes coleções de dados. Estes precisam desenvolver métodos rápidos e eficientes

Leia mais

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes. Desenvolvimento OO com Java 7 RTTI e Interfaces Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do

Leia mais

AULA 12 CLASSES DA API JAVA. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes alba.lopes@ifrn.edu.br

AULA 12 CLASSES DA API JAVA. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes alba.lopes@ifrn.edu.br AULA 12 CLASSES DA API JAVA Disciplina: Programação Orientada a Objetos Professora: Alba Lopes alba.lopes@ifrn.edu.br CLASSES DA API JAVA A maioria dos programas de computador que resolvem problemas do

Leia mais

Feature-Driven Development

Feature-Driven Development FDD Feature-Driven Development Descrição dos Processos Requisitos Concepção e Planejamento Mais forma que conteúdo Desenvolver um Modelo Abrangente Construir a Lista de Features Planejar por

Leia mais

2 Diagrama de Caso de Uso

2 Diagrama de Caso de Uso Unified Modeling Language (UML) Universidade Federal do Maranhão UFMA Pós Graduação de Engenharia de Eletricidade Grupo de Computação Assunto: Diagrama de Caso de Uso (Use Case) Autoria:Aristófanes Corrêa

Leia mais

Figura 1 Busca Linear

Figura 1 Busca Linear ----- Evidentemente, possuir os dados não ajuda o programador ou o usuário se eles não souberem onde os dados estão. Imagine, por exemplo, uma festa de casamento com cem convidados na qual não se sabe

Leia mais

Unidade IV: Ponteiros, Referências e Arrays

Unidade IV: Ponteiros, Referências e Arrays Programação com OO Acesso em Java a BD Curso: Técnico em Informática Campus: Ipanguaçu José Maria Monteiro Pontifícia Universidade Católica do Rio de Janeiro PUC-Rio Departamento Clayton Maciel de Informática

Leia mais

Recursos. Um recurso é ou um dispositivo físico (dedicado) do hardware, ou Solicitar o recurso: esperar pelo recurso, até obtê-lo.

Recursos. Um recurso é ou um dispositivo físico (dedicado) do hardware, ou Solicitar o recurso: esperar pelo recurso, até obtê-lo. Um recurso é ou um dispositivo físico (dedicado) do hardware, ou um conjunto de informações, que deve ser exclusivamente usado. A impressora é um recurso, pois é um dispositivo dedicado, devido ao fato

Leia mais

Aula 11: Análise Dinâmica - 2a. parte

Aula 11: Análise Dinâmica - 2a. parte Aula 11: Análise Dinâmica - 2a. parte Nesta aula, continuaremos nossa discussão a respeito da análise dinâmica, focando na atividade de teste. Iremos dar uma breve olhada em algumas das noções básicas

Leia mais

Programação por Objectos. Java

Programação por Objectos. Java Programação por Objectos Java Parte 2: Classes e objectos LEEC@IST Java 1/24 Classes (1) Sintaxe Qualif* class Ident [ extends IdentC] [ implements IdentI [,IdentI]* ] { [ Atributos Métodos ]* Qualif:

Leia mais

Programação Orientada a Objetos em java. Polimorfismo

Programação Orientada a Objetos em java. Polimorfismo Programação Orientada a Objetos em java Polimorfismo Polimorfismo Uma característica muito importante em sistemas orientados a objetos Termo proveniente do grego, e significa muitas formas Em POO, significa

Leia mais

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada Programação Estruturada Programação Estruturada Paradigmas de Linguagens de Programação As linguagens desse paradigma são muitas vezes chamadas de linguagens convencionais, procedurais ou imperativas.

Leia mais

Módulo 06 Desenho de Classes

Módulo 06 Desenho de Classes Módulo 06 Desenho de Classes Última Atualização: 13/06/2010 1 Objetivos Definir os conceitos de herança, polimorfismo, sobrecarga (overloading), sobreescrita(overriding) e invocação virtual de métodos.

Leia mais

Sistemas de numeração

Sistemas de numeração E Sistemas de numeração Aqui estão apenas números ratificados. William Shakespeare A natureza tem algum tipo de sistema de coordenadas geométrico-aritmético, porque a natureza tem todos os tipos de modelos.

Leia mais

9 Comandos condicionais

9 Comandos condicionais 9 Comandos condicionais Um comando condicional é uma instrução empregada quando se deseja criar um desvio, isto é, a opção de executar-se ou não um determinado trecho de código, segundo uma condição. Em

Leia mais

MÓDULO 6 INTRODUÇÃO À PROBABILIDADE

MÓDULO 6 INTRODUÇÃO À PROBABILIDADE MÓDULO 6 INTRODUÇÃO À PROBBILIDDE Quando estudamos algum fenômeno através do método estatístico, na maior parte das vezes é preciso estabelecer uma distinção entre o modelo matemático que construímos para

Leia mais

Subtipos e Subclasses

Subtipos e Subclasses Subtipos e Subclasses Aula 15 do curso 6.170 15 de outubro de 2001 Sumário 1Subtipos 32 2 Exemplo: Bicicletas 33 3 Exemplo: Quadrado e retângulo 37 4 Princípio de substituição 38 5 Subclasses e subtipos

Leia mais

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc. Classes Abstratas Técnico em Informática, M.Sc. Classes Abstratas 2 Classes Abstratas Abstração Devemos considerar as qualidades e comportamentos independentes dos objetos a que pertencem, isolamos seus

Leia mais

Dadas a base e a altura de um triangulo, determinar sua área.

Dadas a base e a altura de um triangulo, determinar sua área. Disciplina Lógica de Programação Visual Ana Rita Dutra dos Santos Especialista em Novas Tecnologias aplicadas a Educação Mestranda em Informática aplicada a Educação ana.santos@qi.edu.br Conceitos Preliminares

Leia mais

Tabelas de Espalhamento

Tabelas de Espalhamento Tabelas de Espalhamento Motivação Algumas das estruturas de dados vistas anteriormente requerem que seus elementos (células dinâmicas) sejam inspecionados seqüencialmente até que a desejada seja encontrada.

Leia mais

Memory Leak em Java?

Memory Leak em Java? 1 Memory Leak em Java? Saiba como memory leaks se manifestam em Java e como evitá-los Sobre o Autor Carlos Eduardo G. Tosin (carlos@tosin.com.br) é formado em Ciência da Computação pela PUC-PR, pós-graduado

Leia mais

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi 5 Conclusão Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi permitir que scripts Lua instanciem e usem

Leia mais

Noções sobre Objetos e Classes

Noções sobre Objetos e Classes Noções sobre Objetos e Classes Prof. Marcelo Cohen 1. Elementos de programação Revisão de programação variáveis, tipos de dados expressões e operadores cadeias de caracteres escopo de variáveis Revisão

Leia mais

Algoritmos em Javascript

Algoritmos em Javascript Algoritmos em Javascript Sumário Algoritmos 1 O que é um programa? 1 Entrada e Saída de Dados 3 Programando 4 O que é necessário para programar 4 em JavaScript? Variáveis 5 Tipos de Variáveis 6 Arrays

Leia mais

JSP - ORIENTADO A OBJETOS

JSP - ORIENTADO A OBJETOS JSP Orientação a Objetos... 2 CLASSE:... 2 MÉTODOS:... 2 Método de Retorno... 2 Método de Execução... 2 Tipos de Dados... 3 Boolean... 3 Float... 3 Integer... 4 String... 4 Array... 4 Primeira:... 4 Segunda:...

Leia mais

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Programação Orientada a Objetos Herança Técnico em Informática. Prof. Marcos André Pisching, M.Sc. Herança Técnico em Informática, M.Sc. Herança 2 Herança Reutilização de código Exemplo Banco: Um banco oferece diversos serviços que podem ser contratados individualmente pelos clientes. Quando um serviço

Leia mais

Linguagem de Programação III

Linguagem de Programação III Linguagem de Programação III Aula-3 Criando Classes em Java Prof. Esbel Tomás Valero Orellana Da Aula Anterior Classes em Java, sintaxe básica Tipos básicos de dados em Java, como escolher o tipo apropriado

Leia mais

Busca. Pesquisa sequencial

Busca. Pesquisa sequencial Busca Banco de dados existem para que, de tempos em tempos, um usuário possa localizar o dado de um registro, simplesmente digitando sua chave. Uma tabela ou um arquivo é um grupo de elementos, cada um

Leia mais

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto ALGORITMOS PARTE 01 Fabricio de Sousa Pinto Algoritmos: Definição 2 É uma sequência de instruções finita e ordenada de forma lógica para a resolução de uma determinada tarefa ou problema. Algoritmos 3

Leia mais

Análise de Ponto de Função

Análise de Ponto de Função Complemento para o Curso Análise de Ponto de Função FUNÇÕES DO TIPO DADO O termo Arquivo não significa um arquivo do sistema operacional, como é comum na área de processamento de dados. Se refere a um

Leia mais

Programação Orientada a Objetos (DPADF 0063)

Programação Orientada a Objetos (DPADF 0063) Programação Orientada a Objetos (DPADF 0063) Aula 6 Polimorfismo Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof.

Leia mais

ESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE

ESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE ESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE Fabiana Gomes Marinho Faculdade Lourenço Filho Resumo: Na UML, a modelagem conceitual dos dados é descrita pelo diagrama de classes, que através

Leia mais

A importância da Senha. Mas por que as senhas existem?

A importância da Senha. Mas por que as senhas existem? 1 A importância da Senha Atualmente a quantidade de sistemas (Bancos, E-mail, Intranet, Rede Local etc) que precisamos utilizar no dia-a-dia é extremamente grande e ao mesmo tempo acaba sendo um tanto

Leia mais

Modelagem e Implementação (Incremental de um Software para Controle) de Aquário de Peixes

Modelagem e Implementação (Incremental de um Software para Controle) de Aquário de Peixes Modelagem e Implementação de Aquário de Peixes- por Jorge Fernandes - Página 1 Modelagem e Implementação (Incremental de um Software para Controle) de Aquário de Peixes Jorge Fernandes Natal, Agosto de

Leia mais