10. encapsulação; cópia de instâncias; igualdade de instâncias – fundamentos de programação...
DESCRIPTION
Fundamentos da Programação 10: • Encapsulação • Cópia de instâncias • Igualdade de instâncias Apresentação 10 da unidade curricular de Fundamentos de Programação da Universidade Europeia. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI do ISCTE-IUL, incluindo Luís Nunes, Ricardo Ribeiro, André Santos e o próprio Manuel Menezes de Sequeira.TRANSCRIPT
Apresentação 10
EncapsulaçãoCópia de instânciasIgualdade de instâncias
Fundamentos de Programação 2
Da apresentação anterior…
Operação toString
Classes, instâncias e objectos
Leituras com Scanner
2013/2014
Fundamentos de Programação 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 ou clientes: acedem apenas a
interface
Resultado são módulos Rotinas Objectos/classes Pacotes
2013/2014
Ou «encapsulamento»
.
A ver mais tarde.
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?
2013/2014 Fundamentos de Programação 4
Fundamentos de Programação 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!2013/2014
Encapsulação: interface
Métodos e rotinas Cabeçalho apenas
Classes Operações Propriedades …
2013/2014 Fundamentos de Programação 6
Encapsulação: implementação
Métodos e rotinas Corpo apenas
Classes Métodos auxiliares Métodos enquanto implementação de
operações Atributos …
2013/2014 Fundamentos de Programação 7
Encapsulação: rotinas
2013/2014 Fundamentos de Programação 8
{ if (m == 0 && n == 0) throw new 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);
int possibleGcd = Math.min(m, n); while (m % possibleGcd != 0 || n % possibleGcd != 0) possibleGcd--;
return possibleGcd;}
/** * 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) */ public static int gcd(int m, int n)
2013/2014 Fundamentos de Programação 9
{ if (m == 0 && n == 0) throw new 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);
int possibleGcd = Math.min(m, n); while (m % possibleGcd != 0 || n % possibleGcd != 0) possibleGcd--;
return possibleGcd;}
Interface: como se usa.
Interface: o que faz, contrato.
Implementação: como funciona.
/** * 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) */ public static int gcd(int m, int n)
2013/2014 Fundamentos de Programação 10
{ if (m == 0 && n == 0) throw new IllegalArgumentException("Illegal call with " + "m = 0 and n = 0."); m = Math.abs(m); n = Math.abs(n); while (m != 0) { int temporary = m; m = n % m; n = temporary; }
return n;}
/** * 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) */ public static int gcd(int m, int n)
Implementação alternativa:
funcionamento diferente.
Mesma interface: usa-se da mesma forma,
faz o mesmo.
Encapsulação: classes
2013/2014 Fundamentos de Programação 11
private final double abscissa; private final double ordinate;
{ this.abscissa = abscissa; this.ordinate = ordinate; }
{ return abscissa; }
{ return ordinate; }
{ return Math.sqrt(abscissa * abscissa + ordinate * ordinate); }
{ return Math.atan2(ordinate, abscissa); }
}2013/2014 Fundamentos de Programação 12
public class Point {
public Point(final double abscissa, final double ordinate)
public double getAbscissa()
public double getOrdinate()
public double getRadius()
public double getAngle()
}
private final double abscissa; private final double ordinate;
{ this.abscissa = abscissa; this.ordinate = ordinate; }
{ return abscissa; }
{ return ordinate; }
{ return Math.sqrt(abscissa * abscissa + ordinate * ordinate); }
{ return Math.atan2(ordinate, abscissa); }
}
Interface:• Como se usa.
Interface em documentação (omissa):
• O que representa.• Como se comporta.• Contratos.• Etc.
Implementação:• Como funciona.
public class Point {
private double rho; private double theta;
public Point(final double abscissa, final double ordinate) { rho = Math.sqrt(abscissa * abscissa + ordinate * ordinate); theta = Math.atan2(ordinate, abscissa); }
public double getAbscissa() { return rho * Math.cos(theta); }
public double getOrdinate() { return rho * Math.sin(theta); }
public double getRadius() { return rho; }
public double getAngle() { return theta; }
}2013/2014 Fundamentos de Programação 13
private final double rho; private final double theta;
{ rho = Math.sqrt(abscissa * abscissa + ordinate * ordinate); theta = Math.atan2(ordinate, abscissa); }
{ return rho * Math.cos(theta); }
{ return rho * Math.sin(theta); }
{ return rho; }
{ return theta; }
}
public class Point {
public Point(final double abscissa, final double ordinate)
public double getAbscissa()
public double getOrdinate()
public double getRadius()
public double getAngle()
}
Implementação alternativa:• Funcionamento diferente.Mesma interface:• Usa-se da mesma forma!
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
2013/2014 Fundamentos de Programação 14
Fundamentos de Programação 15
Encapsulação: controlo de acesso
Característica de classe Tipo Acesso
Operações Interface Público
Propriedades (operações inspectoras obtêm e operações modificadoras alteram)
Interface Público
Métodos auxiliares Implementação
Privado
Métodos enquanto implementação de operações
Implementação
Público
Atributos Implementação
Privados
2013/2014
Fundamentos de Programação 16
Encapsulação: propriedades Propriedades são interface (inspectores e
modificadores)
public class Rational { …
public int getNumerator() { … } public int getDenominator() { … } …}
Rational rational = new Rational(1, 4);out.println(rational.getDenominator());
2013/2014
Por razões históricas, os inspectores das propriedades começam com o horrível prefixo get.
Fundamentos de Programação 17
Encapsulação: atributos
Atributos são implementação
public class Rational { private int numerator; private int denominator; …}
Rational rational = new Rational(1, 4);rational.denominator = 0;
2013/2014
Fundamentos de Programação 18
Encapsulação: métodos auxiliares
Métodos auxiliares são implementação
public class Rational { … public Rational(final int numerator, final int denominator) { … reduce(); } … private void reduce() { final int gcd = IntegerUtilities.gcd(numerator, denominator); numerator /= gcd; denominator /= gcd; } …}
Rational rational = new Rational(2, 8);rational.reduce();
2013/2014
Fundamentos de Programação 19
Cópia de instâncias
Inicializações e atribuições afectam apenas referências!
Necessário construtor por cópia
public class Point { … public Point(final Point other) { abscissa = other.getAbscissa(); ordinate = other.getOrdinate(); } … private final double abscissa; private final double ordinate;}
Point a = new Point(1.0, -2.0);Point b = a;Point c = new Point(a);
2013/2014
a
(1; -2)b
c
(1; -2)
Fundamentos de Programação 20
Igualdade de instâncias
Operador == com referências verifica identidade e não igualdade!
Necessária operação!
public class Point { … public boolean isEqualTo( final Point other) { return getAbscissa() == other.getAbscissa() && getOrdinate() == other.getOrdinate(); } …}
Point a = new Point(1.0, -2.0);Point b = a;Point c = new Point(a);
2013/2014
a
(1; -2)b
c
(1; -2)
b == a? Sim.c == a? Não!b.isEqualTo(a)? Sim.c.isEqualTo(a)? Sim!
Mais tarde usaremos equals().
Fundamentos de Programação 21
A reter
Encapsulação em Java Abstracção Módulos em Java Interface vs. implementação Modificadores de acesso public e private Vantagens da encapsulação
Cópia de instâncias usando construtor
Igualdade entre instâncias usando operação
2013/2014
Fundamentos de Programação 22
Sumário
Encapsulamento
Cópia de instâncias
Igualdade entre instâncias
2013/2014