Sunteți pe pagina 1din 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;
}
}

LEEC@IST

0..1

Conta

conta
public class Conta{
Pessoa dono;
...
Conta(Pessoa dono){
this.dono = dono;
...
}
}

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

public class Pessoa {


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

Endereo

public class Endereo {


String rua;
...
}

Java 6/32

Associao (5)
Pessoa

1
dono

0..10

Conta

contas

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

Empresa

empregador
Emprego

~ vencimento: float
~ dataEntrada: long

public class Pessoa {


Empresa empregador;
Emprego emprego;
...
}

LEEC@IST

public class Emprego {


float vencimento;
long dataEntrada;
...
}

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);

O javac gera os seguintes ficheiros:

LEEC@IST

Conta.class
Conta$Permisso.class

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.

LEEC@IST

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

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

S-ar putea să vă placă și