Anda di halaman 1dari 32

Programao por Objectos Java

Parte 5: Associaes

LEEC@IST

Java 1/32

Associao reviso
Uma associao representa uma referncia entre objectos. Numa associao so definidos:
Identificador termo descritivo da associao. Papeis (role) representados pela associao em cada uma das classes relacionadas. Multiplicidade nmero de objectos associados em cada instncia da associao.

LEEC@IST

Java 2/32

Associao (1)
Associao: representada por atributos de tipo classe do associado. 1. A associao definitivamente estabelecida quando ambos os atributos forem inicializados. 2. A eliminao da associao exige que os dois atributos deixem de referenciar o outro objecto associado.

LEEC@IST

Java 3/32

Associao (2)
Pessoa 1 dono public class Pessoa { Conta conta; ... Pessoa(){ conta = null; ... } void associarConta(Conta conta) { this.conta = conta; } } 0..1 conta public class Conta{ Pessoa dono; ... Conta(Pessoa dono){ this.dono = dono; ... } } Conta

LEEC@IST

Java 4/32

Associao (3)
Associaes dirigidas: no Java, apenas a classe partida da seta contm o atributo para a classe de chegada. Multiplicidade das associaes: no Java, a multiplicidade distinta de 0..1 e 1 implementada por atributos de tipo tabelas, Vector, nas classes associadas. Associaes que transportam informao: no Java, as classes associadas possuem um atributo extra para a classe de associao.
LEEC@IST Java 5/32

Associao (4)
Pessoa reside Endereo

public class Pessoa { Conta conta; Endereo reside; ... void Pessoa(Endereo endereo) { conta = null; reside = endereo; ... } }
LEEC@IST

public class Endereo { String rua; ... }

Java 6/32

Associao (5)
Pessoa 1 dono 0..10 contas Conta public class Pessoa { public class Conta{ int numProxConta=0; Pessoa dono; static final int numMaxConta=10; ... Conta[] conta; Conta(Pessoa dono){ ... this.dono = dono; Pessoa() { conta = new Conta[numMaxConta]; } } } void associarConta(Conta conta){ if (numProxConta<numMaxConta) this.conta[numProxConta++] = conta; else System.out.println(Nmero mximo atingido!"); } }
LEEC@IST Java 7/32

Associao (6)
Pessoa 1..100 empregado Emprego ~ vencimento: float ~ dataEntrada: long 1 empregador Empresa

public class Pessoa { Empresa empregador; Emprego emprego; ... }

public class Emprego { float vencimento; long dataEntrada; ... }

LEEC@IST

Java 8/32

Associao (7)
public class Empresa { int numProxContrato=0; static final int numMaxContrato=100; Object[][] ee; // par(empregado,emprego) ... Empresa() { ee = new Object[numMaxContrato][2]; ... } void novoContrato(Pessoa empregado, Emprego emprego) { if (numProxContrato<numMaxContrato) { ee[numProxContrato][0]=(Object)empregado; ee[numProxContrato++][1]=(Object)emprego; } else System.out.println(Nmero mx atingido!); } }
LEEC@IST Java 9/32

Associao (8)
da responsabilidade do programador garantir o correcto estabelecimento das associaes e manuteno da sua coerncia.

LEEC@IST

Java 10/32

Classes aninhadas (1)


Uma classe aninhada uma classe definida dentro de outra classe. Uma classe aninhada um membro da classe que a envolve:
A classe aninhada e a classe que a envolve partilham uma relao de confiana em que cada uma pode aceder a todos os membros da outra (privados ou no). As classes aninhadas podem ter qualificadores de visibilidade prprios dos membros de classe (private, protected, public, ou por omisso, de pacote).

LEEC@IST

Java 11/32

Classes aninhadas (2)


Uma classe aninhada pode estender qualquer outra classe, incluindo a classe que a envolve. Qualquer classe, com excepo da classe que a envolve, pode estender a classe aninhada, desde que tenha acesso mesma, contudo a subclasse no herda os privilgios de acesso que a classe aninhada tem com a classe que a envolve. Tal como qualquer classe no aninhada, uma classe aninhada pode ser declarada final ou abstract.

LEEC@IST

Java 12/32

Classes aninhadas (3)


Uma classe aninhada pode ou no ser esttica: Uma classe aninhada esttica permite estruturar tipos em contextos onde os tipos faam sentido. Uma classe aninhada no esttica define uma relao especial entre o objecto aninhado e o objecto que o envolve.

LEEC@IST

Java 13/32

Classes aninhadas estticas (1)


Quando uma classe aninhada esttica, comportase como uma classe no aninhada, excepto que:
O seu nome definido pela classe envolvente (expresso na forma ClasseEnvolvente.ClasseAninhada). A sua acessibilidade definida pela classe envolvente: a classe aninhada acessvel apenas se a classe envolvente acessvel. Uma classe aninhada pode aceder a todos os membros da classe que a envolve (privados ou no), incluindo membros herdados (a membros no estticos apenas atravs de uma referncia apropriada).

LEEC@IST

Java 14/32

Classes aninhadas estticas (2)


public class Conta { private long quantia; private Pessoa dono; public static class Permisso { public boolean levantar, fechar; } public Permisso permissoPara(Pessoa p) { Permisso perm = new Permisso(); perm.levantar = podeLevantar(p); perm.fechar = podeFechar(p); return perm; } // ... definir podeLevantar e podeFechar }
LEEC@IST Java 15/32

Classes aninhadas estticas (3)


Relativamente ao exemplo anterior: Num objecto mc do tipo Conta, a permisso para o dono da conta pode ser obtida da seguinte forma:
Conta.Permisso perm = mc.permissoPara(dono); Conta.class Conta$Permisso.class

O javac gera os seguintes ficheiros:

LEEC@IST

Java 16/32

Classes aninhadas no estticas (1)


Quando uma classe aninhada no esttica, comporta-se como uma classe no aninhada, excepto que: No pode conter membros estticos (incluindo classes aninhadas estticas), com a excepo de atributos simultaneamente final e static. Uma instncia de uma classe aninhada no esttica est associada a uma instncia da classe que a envolve.

LEEC@IST

Java 17/32

Classes aninhadas no estticas (2)


public class Conta { private long nmero; private long quantia; private Pessoa dono; private Aco ltimaAco; public class Aco { private String aco; private long quantia; Aco(String aco, long quantia) { this.aco = aco; this.quantia = quantia; } public String toString() { //identifica a conta que a envolve return nmero+": "+aco+" "+quantia; } }
LEEC@IST Java 18/32

Classes aninhadas no estticas (3)


// ... Continuao do slide anterior public void depositar(long quantia) { this.quantia += quantia; ltimaAco = new Aco("depositar", quantia); } public void levantar(long quantia) { this.quantia -= quantia; ltimaAco = new Aco(levantar", quantia); } // ... }

LEEC@IST

Java 19/32

Classes aninhadas no estticas (4)


Relativamente ao exemplo anterior: A instruo que cria a ltima aco no depsito e levantamento equivalente a:
ltimaAco = this.new Aco("depositar", quantia); ltimaAco = this.new Aco("levantar", quantia);

O mtodo toString acede directamente ao atributo nmero da classe Conta que o envolve.
Uma classe aninhada pode aceder directamente a todos os membros da classe que a envolve, incluindo atributos e mtodos privados. A classe envolvente tambm pode aceder aos membros privados da classe aninhada, mas apenas atravs de uma referncia explcita para o objecto da classe aninhada (ltimaAco).
Java 20/32

LEEC@IST

Classes aninhadas no estticas (5)


Relativamente ao exemplo anterior (cont): Um objecto da classe aninhada est sempre associado a um objecto da classe que o envolve, contudo o recproco no verdadeiro.
Uma classe envolvente pode no ter associado um objecto da classe aninhada, ou pode ter vrios. Quando o mtodo depositar cria um objecto Aco, uma referncia para o objecto Conta com quem est associado automaticamente guardada no novo objecto Aco.
O nome da referncia para o objecto envolvente o this precedido pelo nome da classe envolvente, uma forma de thisqualificado. Alternativamente, o mtodo toString podia aceder ao nmero do objecto Conta com quem est associado da seguinte forma:
return Conta.this.nmero+": "+aco+" "+quantia; LEEC@IST Java 21/32

Classes aninhadas no estticas (6)


Relativamente ao exemplo anterior (continuao): O javac gera os seguintes ficheiros:
Conta.class Conta$Aco.class

LEEC@IST

Java 22/32

Classes aninhadas no estticas (7)


Um mtodo de transferncia de uma certa quantia de uma outra conta para a conta actual
public void transferir(Conta outra, long quantia) { outra.levantar(quantia); depositar(quantia); ltimaAco=this.new Aco("transferir-d",quantia); outra.ltimaAco=outra.new Aco("transferir-l",quantia); }

LEEC@IST

Java 23/32

Classes aninhadas no estticas (8)


Os atributos e mtodos de uma classe aninhada podem esconder alguns atributos e mtodos da classe que a envolve de duas formas distintas:
Um atributo ou mtodo, declarado na classe envolvente, redeclarado na classe aninhada. Um atributo ou mtodo, declarado na classe envolvente, herdado pela classe aninhada.

Em ambos os casos, o uso do nome simples na classe aninhada sempre relativo classe aninhada. Para se aceder ao atributo ou mtodo da classe envolvente deve usar-se explicitamente o this-qualificado.

LEEC@IST

Java 24/32

Associao (9)
As associaes podem ainda ser implementadas com recurso s classes aninhadas (ver slide 31 de agregao/composio (4)).

LEEC@IST

Java 25/32

Agregao/Composio reviso (1)


A agregao/composio uma associao, que denota uma relao do todo ser formado por partes. A agregao/composio dita como sendo uma relao de has-a.

LEEC@IST

Java 26/32

Agregao/Composio reviso (2)


A agregao uma associao, que denota uma relao do todo ser formado por partes. todo parte

Na composio, o desaparecimento do todo conduz ao desaparecimento das partes. todo


LEEC@IST

parte
Java 27/32

Agregao/Composio (1)
A agregao/composio pode ser implementada em Java tal como uma associao:
Atributos de tipo referncia. Classes aninhadas.

Relativamente composio, necessrio ainda garantir a coerncia sobre o desaparecimento do todo implicar a desaparecimento das partes.

LEEC@IST

Java 28/32

Agregao/Composio (2)
1 Empresa 1..10 Departamento

public class Empresa { int numProxDepartamento = 0; static final int numMaxDepartamentos = 10; Departamento departamentos[]; ... Empresa() { departamentos = new Departamento[numMaxDepartamentos]; ... }

LEEC@IST

Java 29/32

Agregao/Composio (3)
// ... Continuao do slide anterior void novoDepartamento() { if (numProxDepartamento<numMaxDepartamentos) departamentos[numProxDepartamento++] = new Departamento(this); else System.out.println(Nmero mx atingido!); } } public class Departamento { Empresa empresa; ... Departamento(Empresa e) { empresa = e; } }
LEEC@IST Java 30/32

Agregao/Composio (4)
Alternativamente, usando classes aninhadas:
A classe Departamento definida como classe aninhada da classe Empresa. Deixa de ser necessrio guardar uma referncia da classe Departamento para a classe Empresa, pois esta disponibilizada implicitamente pelo Java atravs do thisqualificado.

LEEC@IST

Java 31/32

Agregao/Composio (5)
public class Empresa { int numProxDepartamento = 0; static final int numMaxDepartamentos = 10; Departamento departamentos[]; ... public class Departamento {...} Empresa() { departamentos = new Departamento[numMaxDepartamentos]; ... } void novoDepartamento() { if (numProxDepartamento<numMaxDepartamentos) departamentos[numProxDepartamento++] = new Departamento(); else System.out.println(Nmero mx atingido!); }
LEEC@IST Java 32/32