Programação Orientada por Objectos - Aula 4

1,285 views
1,222 views

Published on

Aula teórica 4 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,285
On SlideShare
0
From Embeds
0
Number of Embeds
43
Actions
Shares
0
Downloads
84
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Consulte a documentação da interface Comparable, onde encontrará as propriedades que a operação compareTo tem de ter. É essencial fazê-lo antes de pensar em fornecer a sua própria implementação dessa operação.
  • Consulte a documentação da interface Comparable, onde encontrará as propriedades que a operação compareTo tem de ter e de que forma deve ser consistente com equals. É essencial fazê-lo antes de pensar em fornecer a sua própria implementação dessas operações.Boas práticas:Definir ordenação intrínseca e noção de igualdade apenas para classes representando tipos de valor.Sempre que possível, torne os tipos de valor imutáveis.Consulte a documentação e as boas práticas do Java para garantir que as suas implementações das operações equals e compareTo são completas, correctas e consistentes. É mais difícil do que parece!
  • Programação Orientada por Objectos - Aula 4

    1. 1. Aula 4<br />A infra-estrutura aplicacional de colecções do Java<br />(Java Collections Framework)<br />
    2. 2. Na aula anterior…<br />Interfaces<br />Listas e listas ligadas<br />Iteradores<br />2009/2010<br />Programação Orientada por Objectos<br />2<br />
    3. 3. Infra-estrutura aplicacional de colecções do Java<br />Infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em Java<br />Colecções<br />Agregados estruturados de elementos<br />Cada tipo de colecção tem propriedades específicas<br />Têm diferentes eficiências a realizar operações equivalentes<br />2009/2010<br />Programação Orientada por Objectos<br />3<br />Java Collections Framework (JCF)<br />
    4. 4. JCF: tipos de colecção<br />2009/2010<br />Programação Orientada por Objectos<br />4<br />Legenda:<br />E – tipo dos elementos<br />K – tipo das chaves de um mapa<br />V – tipo dos valores de um mapa<br />? – característica depende do tipo concreto<br />Intrínseca – Ordem depende do valor dos elementos (ou da chave)<br />Extrínseca – Ordem depende da forma de inserção e remoção dos elementos.<br />
    5. 5. JCF: principais interfaces<br />2009/2010<br />Programação Orientada por Objectos<br />5<br />E<br />E<br />«interface»<br />Iterable<br />«interface»<br />Collection<br />E<br />K,V<br />E<br />E<br />«interface»<br />Set<br />«interface»<br />List<br />«interface»<br />Queue<br />«interface»<br />Map<br />“Um conjunto ordenado é um conjunto.”<br />“Uma colecção é iterável.”<br />E<br />E<br />K,V<br />«interface»<br />SortedSet<br />«interface»<br />Deque<br />«interface»<br />SortedMap<br />
    6. 6. JFC: estruturas de dados subjacentes<br />2009/2010<br />Programação Orientada por Objectos<br />6<br />
    7. 7. JCF: elementos, chaves e valores<br />Têm de implementar<br />booleanequals(Objectanother)<br />inthashCode()<br />Operações são fornecidas pela classe Object!<br />Podem ser sobrepostas (com cuidado)<br />Se one.equals(another)então one.hashCode() == another.hashCode()<br />Outras restrições<br />2009/2010<br />Programação Orientada por Objectos<br />7<br />Para procurar.<br />Para tabelas de endereçamento calculado.<br />
    8. 8. JCF: classes concretas<br />2009/2010<br />Programação Orientada por Objectos<br />8<br />
    9. 9. JCF: classes concretas<br />2009/2010<br />Programação Orientada por Objectos<br />9<br />E<br />E<br />«interface»<br />RandomAccess<br />«interface»<br />List<br />«interface»<br />Queue<br />E<br />«interface»<br />Deque<br />E<br />E<br />E<br />ArrayList<br />Vector<br />PriorityQueue<br />E<br />E<br />E<br />LinkedList<br />ArrayDeque<br />Stack<br />
    10. 10. JCF: classes concretas<br />2009/2010<br />Programação Orientada por Objectos<br />10<br />E<br />K,V<br />«interface»<br />Set<br />«interface»<br />Map<br />E<br />K,V<br />E<br />K,V<br />«interface»<br />SortedSet<br />«interface»<br />SortedMap<br />HashMap<br />HashSet<br />E<br />K,V<br />K,V<br />K,V<br />TreeSet<br />TreeMap<br />LinkedHashMap<br />LinkedHashSet<br />
    11. 11. JCF: one.compareTo(another)<br />2009/2010<br />Programação Orientada por Objectos<br />11<br />
    12. 12. JCF: Boas práticas<br />Classe implementa compareTo? Então é de valor<br />Logo, deve sobrepor a sua especialização de equals…<br />…pois por omissão equals compara identidade e não igualdade!<br />As operações compareTo e equals devem ser consistentes…<br />…ou seja, one.compareTo(another) == 0 deve resultar no mesmo que one.equals(another)<br />2009/2010<br />Programação Orientada por Objectos<br />12<br />
    13. 13. public class Rational implements Comparable<Rational> {<br /> private final int numerator;<br /> private final int denominator;<br /> …<br /> public intcompareTo(final Rational another){<br /> return getNumerator() * another.getDenominator()<br /> - another.getNumerator() * getDenominator();<br /> }<br /> …<br />}<br />Aplicação à classe Rational<br />2009/2010<br />Programação OrientadaporObjectos<br />13<br />«interface»<br />Comparable<T->Rational><br />Rational<br />
    14. 14. public class Rational implements Comparable<Rational> {<br /> …<br /> public boolean equals(final Object obj) {<br /> if (this == obj)<br /> return true;<br /> if (obj == null || getClass() != obj.getClass())<br /> return false;<br /> final Rational other = (Rational) obj;<br /> return denominator == other.denominator<br /> && numerator == other.numerator;<br /> }<br /> …<br />}<br />Aplicação à classe Rational<br />2009/2010<br />Programação OrientadaporObjectos<br />14<br />
    15. 15. public class Rational implements Comparable<Rational> {<br /> private final int numerator;<br /> private final int denominator;<br /> …<br /> public inthashCode() {<br /> return (getNumerator() + getDenominator())<br /> * (getNumerator() + getDenominator() + 1)<br /> + getDenominator();<br /> }<br /> …<br />}<br />Aplicação à classe Rational<br />2009/2010<br />Programação OrientadaporObjectos<br />15<br />
    16. 16. JCF: List e ArrayList<br />final List<Course> courses =<br /> new ArrayList<Course>();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.add(Ip); // adiciona ao fim<br />courses.add(Poo);<br />int indexOfCourseToRemove = -1;<br />for (int i = 0; i != courses.size(); i++)<br /> if (courses.get(i) == Poo)<br /> indexOfCourseToRemove = i;<br />if (indexOfCourseToRemove != -1)<br /> courses.remove(indexOfCourseToRemove);<br />courses.remove(Ip);<br />2009/2010<br />Programação Orientada por Objectos<br />16<br />É comum usar um tipo mais genérico para aceder a uma colecção do que a classe real do objecto referenciado. Dessa forma pode-se alterar essa classe alterando apenas uma linha de código.<br />Fará sentido indexar uma lista? E se se mudar a classe real para LinkedList?<br />Remoção fora do ciclo? O.K.<br />Remoção dentro do ciclo? Bronca!<br />
    17. 17. JCF: Vector<br />final Vector<Course> courses =<br /> new Vector<Course>();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.add(Ip); // adiciona ao fim<br />courses.add(Poo);<br />for (int i = 0; i != courses.size(); i++)<br /> out.println(courses.get(i));<br />2009/2010<br />Programação Orientada por Objectos<br />17<br />
    18. 18. JCF: Stack<br />final Stack<Course> courses =<br /> new Stack<Course>();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.push(Ip); //adiciona no topo<br />courses.push(Poo);<br />while (!courses.isEmpty()) {<br /> out.println(courses.peek());<br /> courses.pop();<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />18<br />
    19. 19. JCF: List, LinkedList e Iterator<br />final List<Course> courses = <br /> new LinkedList<Course>();<br />…<br />final Course Esi = new Course("ES I");<br />…<br />final Iterator<Course> iterator =<br /> courses.iterator();<br />while (iterator.hasNext()) {<br /> Course course = iterator.next();<br /> if (course == Esi)<br /> iterator.remove();<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />19<br />Dois em um: avança e devolve. Muito discutível!<br />Remoção segura: É removido o último elemento devolvido por next().<br />
    20. 20. JCF: LinkedList e Queue<br />final Queue<Course> courses = new LinkedList<Course>();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.add(Ip); // adicionaaoinício<br />courses.add(Poo); // adicionaaoinício<br />out.println(courses.element());<br />out.println(courses.element());<br />final Iterator<Course> iterator = courses.iterator();<br />while (iterator.hasNext()) {<br /> Course course = iterator.next();<br /> out.println(course);<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />20<br />Mais uma vez, dois em um…<br />
    21. 21. JCF: LinkedList e Deque<br />final Deque<Course> courses = new LinkedList<Course>();<br />final Course Ip = new Course("IP");<br />final Course Poo = new Course("POO");<br />courses.addFirst(Ip); // adicionaaoinício<br />courses.addLast(Poo); // adicionaaofim<br />out.println(courses.getFirst());<br />out.println(courses.getLast());<br />final Iterator<Course> iterator = courses.iterator();<br />while (iterator.hasNext()) {<br /> Course course = iterator.next();<br /> out.println(course);<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />21<br />Mais uma vez, dois em um…<br />
    22. 22. Ciclo for-each<br />final List<Course> courses = <br /> new LinkedList<Course>();<br />for (Course course : courses)<br /> out.println(course);<br />2009/2010<br />Programação Orientada por Objectos<br />22<br />Modo de iteração compacto, sem usar iterador, mas … de utilização limitada (não se pode alterar a colecção, não se pode facilmente percorrer subsequências da colecção, etc.).<br />
    23. 23. JCF: Iteração e alteração concorrentes<br />final List<Course> courses = <br /> new LinkedList<Course>();<br />…<br />final Course Poo = new Course(“POO");<br />…<br />for (Course course : courses) {<br />courses.remove(Poo);<br /> out.println(course);<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />23<br />Alterações durante o ciclo produzem resultados inesperados. Pode mesmo ser lançada a excepção ConcurrentModificationException.<br />
    24. 24. JCF: Map e HashMap<br />final Map<String, Course> courses = <br /> new HashMap<String, Course>();<br />…<br />courses.put("IP", new Course("Introdução à …"));<br />…<br />if (courses.containsKey("IP"))<br /> out.println(courses.get("IP"));<br />for (String key : courses.keySet())<br /> out.println(key);<br />for (Map.Entry<String, Course> entry : courses.entrySet())<br /> out.println(entry);<br />for (Course course : courses.values())<br /> out.println(course);<br />2009/2010<br />Programação Orientada por Objectos<br />24<br />
    25. 25. JCF: Map e TreeMap<br />final Map<String, Course> courses = <br /> new TreeMap<String, Course>();<br />…<br />courses.put("IP", new Course("Introdução à …"));<br />…<br />if (courses.containsKey("IP"))<br /> out.println(courses.get("IP"));<br />for (String key : courses.keySet())<br /> out.println(key);<br />for (Map.Entry<String, Course> entry : courses.entrySet())<br /> out.println(entry);<br />for (Course course : courses.values())<br /> out.println(course);<br />2009/2010<br />Programação Orientada por Objectos<br />25<br />
    26. 26. JCF: Queue e LinkedList<br />Queue<String> courseNames =<br /> new LinkedList<String>();<br />courseNames.add("POO");<br />courseNames.add("ES I");<br />courseNames.add("IP");<br />while(!courseNames.isEmpty()) {<br /> out.println(courseNames.element());<br />courseNames.remove();<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />26<br />
    27. 27. JCF: Queue e PriorityQueue<br />Queue<String> courseNames =<br /> new PriorityQueue<String>();<br />courseNames.add("POO");<br />courseNames.add(“ES I");<br />courseNames.add("IP");<br />while(!courseNames.isEmpty()) {<br /> out.println(courseNames.element());<br /> courseNames.remove();<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />27<br />
    28. 28. JCF: Boas práticas na utilização de colecções<br />Não usar colecções de Object<br />Usar o tipo de colecção mais adequado<br />Atentar na diferente eficiência das mesmas operações em diferentes tipos de colecção (consultar a documentação)<br />Não alterar uma colecção durante uma iteração ao longo dos elementos (ou usar o iterador para o fazer)<br />2009/2010<br />Programação Orientada por Objectos<br />28<br />
    29. 29. JCF: Boas práticas na utilização de colecções<br />Alteração de elementos de colecções com ordem intrínseca pode ter efeitos inesperados<br />Usar sempre classes (de valor) imutáveis quando for necessária ordem intrínseca<br />Ter atenção à documentação: nem todas as colecções permitem a inserção de elementos nulos<br />2009/2010<br />Programação Orientada por Objectos<br />29<br />
    30. 30. A reter…<br />A JCF é uma infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em Java<br />As colecções são agregados estruturados de elementos, tendo cada tipo de colecção propriedades específicas, particularmente quanto à eficiência com que realiza cada operação<br />Para usar bem estas classes é necessário conhecer bem a documentação!<br />2009/2010<br />Programação Orientada por Objectos<br />30<br />
    31. 31. A ler para a próxima aula…<br />Secção 18.6 do livro:<br />Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-0<br />2009/2010<br />Programação Orientada por Objectos<br />31<br />
    32. 32. Aula 4: Sumário<br />A infra-estrutura aplicacional de colecções do Java (Java Collections Framework)<br />2009/2010<br />Programação Orientada por Objectos<br />32<br />

    ×