Aula 10EncapsulaçãoCópia de instânciasIgualdade de instâncias
Da aula anterior…Operação toStringClasses, instâncias e objectosLeituras com Scanner2010/2011Introdução à Programação - DCTI - ISCTE-IUL2
EncapsulaçãoAplica ocultação de informação a elemento de linguagemOculta implementação e revela interfaceProdutores: acesso exclusivoà implementaçãoConsumidores: acedem apenas a interfaceResultado são módulosRotinasObjectos/classesPacotes2010/2011Introdução à Programação - DCTI - ISCTE-IUL3Ou “encapsulamento”.A ver mais tarde.
Interface vs. implementaçãoInterfaceComo se usa?O que faz?Qual o contrato entre produtor e consumidor?ImplementaçãoComo funciona?Qual o mecanismo?2010/2011Introdução à Programação - DCTI - ISCTE-IUL4
Encapsulação: vantagensImplementação pode mudar sem afectar consumidoresProdutores podem garantir bom comportamento dos módulosMais fácil localizar errosMais fácil corrigir errosFacilita abstracção do consumidor!2010/2011Introdução à Programação - DCTI - ISCTE-IUL5
Encapsulação: interfaceMétodos e rotinasCabeçalho apenasClassesOperaçõesPropriedades…2010/2011Introdução à Programação - DCTI - ISCTE-IUL6
Encapsulação: implementaçãoMétodos e rotinasCorpo apenasClassesMétodos auxiliaresMétodos enquanto implementação de operaçõesAtributos…2010/2011Introdução à Programação - DCTI - ISCTE-IUL7
Encapsulação: rotinas2010/2011Introdução à Programação - DCTI - ISCTE-IUL8
{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/2011Introdução à Programação - DCTI - ISCTE-IUL9Interface: 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.
/** * 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/2011Introdução à Programação - DCTI - ISCTE-IUL10public 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.
Encapsulação: classes2010/2011Introdução à Programação - DCTI - ISCTE-IUL11
{this.abscissa = abscissa;this.ordinate = ordinate;    }{returnabscissa;    }{returnordinate;    }{returnMath.sqrt(abscissa * abscissa + ordinate * ordinate);    }{return Math.atan2(ordinate, abscissa);    }privatefinaldoubleabscissa;privatefinaldoubleordinate;}2010/2011Introdução à Programação - DCTI - ISCTE-IUL12publicclassPoint {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.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/2011Introdução à Programação - DCTI - ISCTE-IUL13                                                               {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!Controlo de acessoPode-se controlar acesso a membros de classesUsam-se modificadores de acessopublicprotectedprivateJava tem quatro categorias de acessoPúblico – acesso sem restriçãoProtegidoPor omissão ou privado ao pacotePrivado – acesso apenas no contexto da própria classe2010/2011Introdução à Programação - DCTI - ISCTE-IUL14
Encapsulação: controlo de acesso2010/2011Introdução à Programação - DCTI - ISCTE-IUL15
Encapsulação: propriedadesPropriedades são interface (inspectores e modificadores)Exemplopublicclass Rational {    …publicintgetNumerator() { … }publicintgetDenominator() { … }    …}Rational rational = new Rational(1, 4);out.println(rational.getDenominator());2010/2011Introdução à Programação - DCTI - ISCTE-IUL16
Encapsulação: atributosAtributos são implementaçãoExemplopublicclass Rational {    …privateintnumerator;privateintdenominator;    …}Rational rational = new Rational(1, 4);rational.denominator = 0;2010/2011Introdução à Programação - DCTI - ISCTE-IUL17
Encapsulação: métodos auxiliaresMétodos auxiliares são implementaçãoExemplopublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL18
Cópia de instânciasCópia com inicialização e atribuição afecta apenas referências!Necessário construtor por cópiapublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL19abc(1; -2)(1; -2)
Igualdade de instânciasOperador == 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/2011Introdução à Programação - DCTI - ISCTE-IUL20Mais tarde usaremos equals().abc(1; -2)(1; -2)b == a? Sim.c == a? Não!b.isEqualTo(a)? Sim.c.isEqualTo(a)? Sim!
A reterEncapsulação em JavaAbstracçãoMódulos em JavaInterface vs. implementaçãoModificadores de acesso public eprivateVantagens da encapsulaçãoCópia de instâncias usando construtorIgualdade entre instâncias usando método2010/2011Introdução à Programação - DCTI - ISCTE-IUL21
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-62010/2011Introdução à Programação - DCTI - ISCTE-IUL22

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

  • 1.
    Aula 10EncapsulaçãoCópia deinstânciasIgualdade de instâncias
  • 2.
    Da aula anterior…OperaçãotoStringClasses, instâncias e objectosLeituras com Scanner2010/2011Introdução à Programação - DCTI - ISCTE-IUL2
  • 3.
    EncapsulaçãoAplica ocultação deinformação a elemento de linguagemOculta implementação e revela interfaceProdutores: acesso exclusivoà implementaçãoConsumidores: acedem apenas a interfaceResultado são módulosRotinasObjectos/classesPacotes2010/2011Introdução à Programação - DCTI - ISCTE-IUL3Ou “encapsulamento”.A ver mais tarde.
  • 4.
    Interface vs. implementaçãoInterfaceComose usa?O que faz?Qual o contrato entre produtor e consumidor?ImplementaçãoComo funciona?Qual o mecanismo?2010/2011Introdução à Programação - DCTI - ISCTE-IUL4
  • 5.
    Encapsulação: vantagensImplementação podemudar sem afectar consumidoresProdutores podem garantir bom comportamento dos módulosMais fácil localizar errosMais fácil corrigir errosFacilita abstracção do consumidor!2010/2011Introdução à Programação - DCTI - ISCTE-IUL5
  • 6.
    Encapsulação: interfaceMétodos erotinasCabeçalho apenasClassesOperaçõesPropriedades…2010/2011Introdução à Programação - DCTI - ISCTE-IUL6
  • 7.
    Encapsulação: implementaçãoMétodos erotinasCorpo apenasClassesMétodos auxiliaresMétodos enquanto implementação de operaçõesAtributos…2010/2011Introdução à Programação - DCTI - ISCTE-IUL7
  • 8.
    Encapsulação: rotinas2010/2011Introdução àProgramação - DCTI - ISCTE-IUL8
  • 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/2011Introdução à Programação - DCTI - ISCTE-IUL9Interface: 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.
    /** * Returnsthe 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/2011Introdução à Programação - DCTI - ISCTE-IUL10public 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.
    Encapsulação: classes2010/2011Introdução àProgramação - DCTI - ISCTE-IUL11
  • 12.
    {this.abscissa = abscissa;this.ordinate= ordinate; }{returnabscissa; }{returnordinate; }{returnMath.sqrt(abscissa * abscissa + ordinate * ordinate); }{return Math.atan2(ordinate, abscissa); }privatefinaldoubleabscissa;privatefinaldoubleordinate;}2010/2011Introdução à Programação - DCTI - ISCTE-IUL12publicclassPoint {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.
  • 13.
  • 14.
  • 15.
    Etc.Implementação:Como funciona.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/2011Introdução à Programação - DCTI - ISCTE-IUL13 {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!Controlo de acessoPode-se controlar acesso a membros de classesUsam-se modificadores de acessopublicprotectedprivateJava tem quatro categorias de acessoPúblico – acesso sem restriçãoProtegidoPor omissão ou privado ao pacotePrivado – acesso apenas no contexto da própria classe2010/2011Introdução à Programação - DCTI - ISCTE-IUL14
  • 16.
    Encapsulação: controlo deacesso2010/2011Introdução à Programação - DCTI - ISCTE-IUL15
  • 17.
    Encapsulação: propriedadesPropriedades sãointerface (inspectores e modificadores)Exemplopublicclass Rational { …publicintgetNumerator() { … }publicintgetDenominator() { … } …}Rational rational = new Rational(1, 4);out.println(rational.getDenominator());2010/2011Introdução à Programação - DCTI - ISCTE-IUL16
  • 18.
    Encapsulação: atributosAtributos sãoimplementaçãoExemplopublicclass Rational { …privateintnumerator;privateintdenominator; …}Rational rational = new Rational(1, 4);rational.denominator = 0;2010/2011Introdução à Programação - DCTI - ISCTE-IUL17
  • 19.
    Encapsulação: métodos auxiliaresMétodosauxiliares são implementaçãoExemplopublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL18
  • 20.
    Cópia de instânciasCópiacom inicialização e atribuição afecta apenas referências!Necessário construtor por cópiapublicclass 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/2011Introdução à Programação - DCTI - ISCTE-IUL19abc(1; -2)(1; -2)
  • 21.
    Igualdade de instânciasOperador== 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/2011Introdução à Programação - DCTI - ISCTE-IUL20Mais tarde usaremos equals().abc(1; -2)(1; -2)b == a? Sim.c == a? Não!b.isEqualTo(a)? Sim.c.isEqualTo(a)? Sim!
  • 22.
    A reterEncapsulação emJavaAbstracçãoMódulos em JavaInterface vs. implementaçãoModificadores de acesso public eprivateVantagens da encapsulaçãoCópia de instâncias usando construtorIgualdade entre instâncias usando método2010/2011Introdução à Programação - DCTI - ISCTE-IUL21
  • 23.
    A ler...Capítulos 8e 9 do livro:Y. Daniel Liang, Introduction to Java Programming, 8.ª edição, Prentice-Hall, 2010. ISBN: 978-0-13-213080-62010/2011Introdução à Programação - DCTI - ISCTE-IUL22