Implementando agregações e composições em Java

Dá licença, pessoal!

Sou mais um recém-chegado aqui no Fórum GUJ e queria perguntar uma coisa.

Primeiramente, eu ainda tenho pouco contato com Java (estou ainda em fase de adaptação), mas eu já cursei uma disciplina na faculdade sobre tópicos em Engenharia de Software (detalhe: eu estudo Física), seguindo o livro do Wilson de Pádua Paula Filho.

Nesta disciplina, quando estudei UML, aprendi que, numa relação de agregação entre classes, o objeto “parte” tem existência independente do objeto “todo”, o mesmo não ocorrendo numa relação de composição.

Eu me lembro que, em C++, eu implementava relações de composição utilizando passagem por valor (assim, o objeto “parte” é construído e destruído junto com o objeto “todo”), e relações de agregação, com passagem por referência (neste caso, o objeto “parte” deve ser construído e destruído separadamente do objeto “todo”).

Pois bem. Qual seria a melhor forma de implementar estas relações em Java, haja vista que, se não estou enganado, não há uma forma “ortodoxa” de se fazer passagem por referência em Java?

Desde já, obrigado…
… e prazer em conhecê-los.

Fala cara…
Seja bem-vindo…

Seguinte: é importante ter em mente, que diferente de outras linguagens, em Java vc não pode dizer ao método se um parâmetro está sendo passado por valor ou por referência…
Sendo assim, Java assume duas posições:

[list]
Objetos são passados como referência.
Dados primitivos são passados como valor.
[/list]

Sendo assim existem outras formas de implementar tais relacionamentos identificados por vc a nível de análise.
Exemplo: Vc pode implementar agregação criando um objeto, e apontando duas referências pra ele: uma dentro da classe todo (pode ser um membro de instância) e outra fora da classe todo… Assim a destruição do objeto todo mataria só uma referência e vc poderia acessar o parte através da referência restante :slight_smile:

Só uma pequena correção… Tudo em java é passado por valor, os objetos não são passados por referência. Na verdade o que é passado é uma cópia do “endereço” do objeto. Assim, as duas variáveis estarão “apontando” para o mesmo objeto na memória. Para comprovar essa sistemática, vc pode fazer o seguinte: crie um método que recebe um objeto por parâmetro, se vc passar esse parâmetro para null, nada acontecerá no objeto externo, ele não será passado para null. Se vc der um new no parâmetro, o objeto que ele estará apontando tbm não será mais o mesmo que o anterior…

Espero ter conseguido explicar, hehe… Isso sempre causa confusão.

Fallow