Transcript
Page 1: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Apresentação 10

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

Page 2: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 2

Da apresentação anterior…

Operação toString

Classes, instâncias e objectos

Leituras com Scanner

2013/2014

Page 3: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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.

Page 4: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 5: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 6: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: interface

Métodos e rotinas Cabeçalho apenas

Classes Operações Propriedades …

2013/2014 Fundamentos de Programação 6

Page 7: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 8: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: rotinas

2013/2014 Fundamentos de Programação 8

Page 9: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 10: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 11: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Encapsulação: classes

2013/2014 Fundamentos de Programação 11

Page 12: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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.

Page 13: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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!

Page 14: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 15: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 16: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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.

Page 17: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 18: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 19: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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)

Page 20: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 21: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

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

Page 22: 10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos de Programação - Fundamentos de Programação

Fundamentos de Programação 22

Sumário

Encapsulamento

Cópia de instâncias

Igualdade entre instâncias

2013/2014


Top Related