Aula 10
EncapsulaçãoCópia de instânciasIgualdade de instâncias
Introdução à Programação - DCTI - ISCTE-IUL 2
Da aula anterior…
Operação toString
Classes, instâncias e objectos
Leituras com Scanner
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 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
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?
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 4
Introdução à Programação - DCTI - ISCTE-IUL 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
Encapsulação: interface
Métodos e rotinas Cabeçalho apenas
Classes Operações Propriedades …
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 6
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
Encapsulação: rotinas
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 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)
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 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)
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 10
public static int gcd(int m, int n) { 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
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 11
{ this.abscissa = abscissa; this.ordinate = ordinate; }
{ return abscissa; }
{ return ordinate; }
{ return Math.sqrt(abscissa * abscissa + ordinate * ordinate); }
{ return Math.atan2(ordinate, abscissa); }
private final double abscissa; private final double ordinate;
}2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 12
public class Point {
public Point(final double abscissa, final double ordinate)
public double getAbscissa()
public double getOrdinate()
public double getRadius()
public double getAngle()
}
{ this.abscissa = abscissa; this.ordinate = ordinate; }
{ return abscissa; }
{ return ordinate; }
{ return Math.sqrt(abscissa * abscissa + ordinate * ordinate); }
{ return Math.atan2(ordinate, abscissa); }
private final double abscissa; private final double ordinate;
}
Interface:• Como se usa.
Interface em documentação (omissa):
• O que representa.• Como se comporta.• Contratos.• Etc.
Implementação:• Como funciona.
public class Point {
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; }
private double theta; private double rho;
}2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 13
{ 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; }
private final double theta; private final double rho;
}
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
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 14
Introdução à Programação - DCTI - ISCTE-IUL 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
Privado
Atributos Implementação
Privados
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 16
Encapsulação: propriedades Propriedades são interface (inspectores e modificadores)
Exemplo
public class Rational { …
public int getNumerator() { … } public int getDenominator() { … } …}
Rational rational = new Rational(1, 4);
out.println(rational.getDenominator());
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 17
Encapsulação: atributos
Atributos são implementação
Exemplo
public class Rational { …
private int numerator; private int denominator; …}
Rational rational = new Rational(1, 4);
rational.denominator = 0;
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 18
Encapsulação: métodos auxiliares
Métodos auxiliares são implementação
Exemplo
public class Rational { public Rational(final int numerator, final int denominator) { … reduce(); } … private void reduce() { int gcd = 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 19
Cópia de instâncias
Cópia com inicialização e atribuição afecta apenas referências!
Necessário construtor por cópia
public class Point { … public Point(final Point aPoint) { abscissa = aPoint.getAbscissa(); ordinate = aPoint.getOrdinate(); } … private final int abscissa; private final int ordinate;}
Point a = new Point(1.0, -2.0);Point b = a;Point c = new Point(a);
2010/2011
a
(1; -2)b
c
(1; -2)
Introdução à Programação - DCTI - ISCTE-IUL 20
Igualdade de instâncias
Operador == com referências verifica identidade e não igualdades!
Necessária operação!
public class Point { … public boolean isEqualTo( final Point aPoint) { return getAbscissa() == aPoint.getAbscissa() && getOrdinate() == aPoint.getOrdinate(); } …}
Point a = new Point(1.0, -2.0);Point b = a;Point c = new Point(a);
2010/2011
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().
Introdução à Programação - DCTI - ISCTE-IUL 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 método
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 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 23
Sumário
Encapsulamento
Cópia de instâncias
Igualdade entre instâncias
2010/2011
Top Related