Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias

1.364 visualizações

Publicada em

Apresentação da semana 10 da unidade curricular de Introdução à Programação do DCTI do ISCTE-IUL. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI, incluindo Luís Nunes e André Santos.

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.364
No SlideShare
0
A partir de incorporações
0
Número de incorporações
27
Ações
Compartilhamentos
0
Downloads
81
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias

  1. 1. Aula 10 Encapsulação Cópia de instâncias Igualdade de instâncias
  2. 2. Da aula anterior… Operação toString Classes, instâncias e objectos Leituras com Scanner 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 2
  3. 3. Encapsulação Aplica ocultação de informação a elemento de linguagem Oculta implementação e revela interface Produtores: acesso exclusivoà implementação Consumidores: acedem apenas a interface Resultado são módulos Rotinas Objectos/classes Pacotes 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 3 Ou “encapsulamento”. A ver mais tarde.
  4. 4. Interface vs. implementação Interface Como se usa? O que faz? Qual o contrato entre produtor e consumidor? Implementação Como funciona? Qual o mecanismo? 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 4
  5. 5. Encapsulação: vantagens Implementação pode mudar sem afectar consumidores Produtores podem garantir bom comportamento dos módulos Mais fácil localizar erros Mais fácil corrigir erros Facilita abstracção do consumidor! 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 5
  6. 6. Encapsulação: interface Métodos e rotinas Cabeçalho apenas Classes Operações Propriedades … 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 6
  7. 7. Encapsulação: implementação Métodos e rotinas Corpo apenas Classes Métodos auxiliares Métodos enquanto implementação de operações Atributos … 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 7
  8. 8. Encapsulação: rotinas 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 8
  9. 9. { if (m == 0 && n == 0) thrownew IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n); if (m == 0 || n == 0) return Math.max(m, n); intpossibleGcd = Math.min(m, n); while (m % possibleGcd != 0 || n % possibleGcd != 0) possibleGcd--; returnpossibleGcd; } /** * Returns the greatest common divisor (GCD) of two integer numbers. * * @param m first of the two integer numbers whose GCD will be returned. * @param n second of the two integer numbers whose GCD will be returned. * @return the greatest common divisor of m and n. * @pre m ≠ 0 ∨n ≠ 0 * @post gcd = gcd(m, n) */ publicstaticintgcd(intm, intn) 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 9 Interface: o que faz, contrato. { if (m == 0 && n == 0) thrownew IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n); if (m == 0 || n == 0) return Math.max(m, n); intpossibleGcd = Math.min(m, n); while (m % possibleGcd != 0 || n % possibleGcd != 0) possibleGcd--; returnpossibleGcd; } Interface: como se usa. Implementação: como funciona.
  10. 10. /** * Returns the greatest common divisor (GCD) of two integer numbers. * * @param m first of the two integer numbers whose GCD will be returned. * @param n second of the two integer numbers whose GCD will be returned. * @return the greatest common divisor of m and n. * @pre m ≠ 0 ∨n ≠ 0 * @post gcd = gcd(m, n) */ publicstaticintgcd(intm, intn) 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 10 public staticintgcd(int m, intn) { if (m == 0 && n == 0) thrownew IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n); while (m != 0) { inttemporary = m; m = n % m; n = temporary; } returnn; } /** * Returns the greatest common divisor (GCD) of two integer numbers. * * @param m first of the two integer numbers whose GCD will be returned. * @param n second of the two integer numbers whose GCD will be returned. * @return the greatest common divisor of m and n. * @pre m ≠ 0 ∨n ≠ 0 * @post gcd = gcd(m, n) */ publicstaticintgcd(intm, intn) Implementação alternativa: funcionamento diferente. Mesma interface: usa-se da mesma forma, faz o mesmo.
  11. 11. Encapsulação: classes 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 11
  12. 12. { this.abscissa = abscissa; this.ordinate = ordinate; } { returnabscissa; } { returnordinate; } { returnMath.sqrt(abscissa * abscissa + ordinate * ordinate); } { return Math.atan2(ordinate, abscissa); } privatefinaldoubleabscissa; privatefinaldoubleordinate; } 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 12 publicclassPoint { publicPoint(finaldoubleabscissa, finaldoubleordinate) publicdoublegetAbscissa() publicdoublegetOrdinate() publicdoublegetRadius() publicdoublegetAngle() } { this.abscissa = abscissa; this.ordinate = ordinate; } { returnabscissa; } { returnordinate; } { returnMath.sqrt(abscissa * abscissa + ordinate * ordinate); } { return Math.atan2(ordinate, abscissa); } privatefinaldoubleabscissa; privatefinaldoubleordinate; } Interface: Como se usa. Interface em documentação (omissa): O que representa. Como se comporta. Contratos. Etc. Implementação: Como funciona.
  13. 13. publicclassPoint { publicPoint(finaldoubleabscissa, finaldoubleordinate) { rho = Math.sqrt(abscissa * abscissa + ordinate * ordinate); theta = Math.atan2(ordinate, abscissa); } publicdoublegetAbscissa() { returnrho * Math.cos(theta); } publicdoublegetOrdinate() { returnrho * Math.sin(theta); } publicdoublegetRadius() { returnrho; } publicdoublegetAngle() { returntheta; } privatedoubletheta; privatedoublerho; } 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 13 { rho = Math.sqrt(abscissa * abscissa + ordinate * ordinate); theta = Math.atan2(ordinate, abscissa); } { returnrho * Math.cos(theta); } { returnrho * Math.sin(theta); } { returnrho; } { returntheta; } privatefinaldoubletheta; privatefinaldoublerho; } publicclassPoint { publicPoint(finaldoubleabscissa, finaldoubleordinate) publicdoublegetAbscissa() publicdoublegetOrdinate() publicdoublegetRadius() publicdoublegetAngle() } Implementação alternativa: Funcionamento diferente. Mesma interface: Usa-se da mesma forma!
  14. 14. Controlo de acesso Pode-se controlar acesso a membros de classes Usam-se modificadores de acesso public protected private Java tem quatro categorias de acesso Público – acesso sem restrição Protegido Por omissão ou privado ao pacote Privado – acesso apenas no contexto da própria classe 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 14
  15. 15. Encapsulação: controlo de acesso 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 15
  16. 16. Encapsulação: propriedades Propriedades são interface (inspectores e modificadores) Exemplo publicclass Rational { … publicintgetNumerator() { … } publicintgetDenominator() { … } … } Rational rational = new Rational(1, 4); out.println(rational.getDenominator()); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 16
  17. 17. Encapsulação: atributos Atributos são implementação Exemplo publicclass Rational { … privateintnumerator; privateintdenominator; … } Rational rational = new Rational(1, 4); rational.denominator = 0; 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 17
  18. 18. Encapsulação: métodos auxiliares Métodos auxiliares são implementação Exemplo publicclass Rational { public Rational(finalintnumerator, finalintdenominator) { … reduce(); } … privatevoid reduce() { intgcd = NumberUtilities.gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } … } Rational rational = new Rational(2, 8); rational.reduce(); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 18
  19. 19. Cópia de instâncias Cópia com inicialização e atribuição afecta apenas referências! Necessário construtor por cópia publicclass Point { … public Point(final Point aPoint) { abscissa= aPoint.getAbscissa(); ordinate= aPoint.getOrdinate(); } … privatefinalintabscissa; privatefinalintordinate; } Point a = newPoint(1.0, -2.0); Point b = a; Point c = new Point(a); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 19 a b c (1; -2) (1; -2)
  20. 20. Igualdade de instâncias Operador == com referências verifica identidade e não igualdades! Necessária operação! publicclass Point { … publicbooleanisEqualTo( final Point aPoint) { returngetAbscissa() == aPoint.getAbscissa() && getOrdinate() == aPoint.getOrdinate(); } … } Point a = newPoint(1.0, -2.0); Point b = a; Point c = new Point(a); 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 20 Mais tarde usaremos equals(). a b c (1; -2) (1; -2) b == a? Sim. c == a? Não! b.isEqualTo(a)? Sim. c.isEqualTo(a)? Sim!
  21. 21. A reter Encapsulação em Java Abstracção Módulos em Java Interface vs. implementação Modificadores de acesso public eprivate Vantagens da encapsulação Cópia de instâncias usando construtor Igualdade entre instâncias usando método 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 21
  22. 22. A ler... Capítulos 8 e 9 do livro: Y. Daniel Liang, Introduction to Java Programming, 8.ª edição, Prentice-Hall, 2010. ISBN: 978-0-13-213080-6 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 22
  23. 23. Sumário Encapsulamento Cópia de instâncias Igualdade entre instâncias 2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 23

×