Documente Academic
Documente Profesional
Documente Cultură
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
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
Endereo
Java 6/32
Associao (5)
Pessoa
1
dono
0..10
Conta
contas
Java 7/32
Associao (6)
Pessoa
1..100
empregado
Empresa
empregador
Emprego
~ vencimento: float
~ dataEntrada: long
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)
LEEC@IST
Java 10/32
LEEC@IST
Java 11/32
LEEC@IST
Java 12/32
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)
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)
LEEC@IST
Classes aninhadas
no estticas (5)
LEEC@IST
Java 21/32
Classes aninhadas
no estticas (6)
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)
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
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.
LEEC@IST
Java 28/32
Agregao/Composio (2)
1
Empresa
1..10
Departamento
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