semana 10: encapsulação, cópia de instâncias, igualdade de instâncias

23
Aula 10 Encapsulação Cópia de instâncias Igualdade de instâncias

Upload: manuel-menezes-de-sequeira

Post on 11-Jun-2015

1.211 views

Category:

Technology


0 download

DESCRIPTION

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.

TRANSCRIPT

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

Aula 10

EncapsulaçãoCópia de instânciasIgualdade de instâncias

Page 2: Semana 10: Encapsulação, cópia de instâncias, igualdade 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

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

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.

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

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

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

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

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

Encapsulação: interface

Métodos e rotinas Cabeçalho apenas

Classes Operações Propriedades …

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 6

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

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

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

Encapsulação: rotinas

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 8

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

{ 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.

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

/** * 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.

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

Encapsulação: classes

2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 11

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

{ 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.

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

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!

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

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

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

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

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

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

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

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

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

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

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

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)

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

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().

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

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

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

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

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

Introdução à Programação - DCTI - ISCTE-IUL 23

Sumário

Encapsulamento

Cópia de instâncias

Igualdade entre instâncias

2010/2011