Diagrama de classe para implementação em Java

Uma dúvida que sempre me recorre. Tenho uma classe Cliente, e uma Endereco. Em Enderco tenho como atributos, rua, bairro, cidade, etc. E em Cliente tenho nome, cpf,etc…, endereco.

Qual a associação correta entre elas, associação simples, agregação ou composição? E como a classe Cliente ficaria em Java, dependendo do tipo de associação usada?

Isso depende de como você irá utilizar.

Pessoa só pode ter um endereço? Um para Um
Pessoa pode ter vários endereços? Um para Muitos
Endereço poderá ter várias pessoas? Muitos para muitos

Isso vai do seu requisito. Você vai usar JPA? Se sim, aqui mostra como utilizar os relacionamentos acima:
JPA: Mini Livro - Primeiros passos e conceitos detalhados

Pense da seguinte forma, um endereço é algo fundamental a um cliente, de tal forma que um objeto cliente não pode existir sem um endereço?
Se a resposta for não, o cliente existe sem um endereço, a associação é agregação (aquela do losango branco).
A classe java teria o atributo endereço e seus getters e setters.
Se a resposta for sim, um cliente não pode existir sem um endereço, a associação é uma composição (aquela do losango colorido).
A classe java teria que ter o endereço passado no construtor, pois, é a única forma de garantir que um atributo obrigatório foi definido.

Eu prefiro composição, ficaria mais ou menos assim

public class Cliente{
    private long id;
    private String nome;
    private Endereco endereco;
    //getters e setters

}

Me corrijam se estiver errado, é sempre bom novas opniões.

[quote=gilluan]Eu prefiro composição, ficaria mais ou menos assim

public class Cliente{
    private long id;
    private String nome;
    private Endereco endereco;
    //getters e setters

}

Me corrijam se estiver errado, é sempre bom novas opniões.[/quote]Por curiosidade, como ficaria o agregação?

Em partes está correto, faltou definir como esta relação se estabelece.
Aqui e aqui tem mais detalhes.

[quote=Hebert Coelho][quote=gilluan]Eu prefiro composição, ficaria mais ou menos assim

public class Cliente{
    private long id;
    private String nome;
    private Endereco endereco;
    //getters e setters

}

Me corrijam se estiver errado, é sempre bom novas opniões.[/quote]Por curiosidade, como ficaria o agregação?[/quote]++²

Aí eu faria conforme aprendi no seu tutorial: http://uaihebert.com/?p=1622, você conhece? rssssss

 @OneToOne ou @OneToMany depende da minha necessidade
    @JoinColumn(name = "endereco_id")
    private Endereco endereco;

Seria isso mesmo?

[quote=gilluan]Aí eu faria conforme aprendi no seu tutorial: http://uaihebert.com/?p=1622, você conhece? rssssss

 @OneToOne ou @OneToMany depende da minha necessidade
    @JoinColumn(name = "endereco_id")
    private Endereco endereco;

Seria isso mesmo?[/quote]Até que conheço… mas você está dizendo que a diferença entre agregação e composição é a anotação do JPA?

Não, Não. Pelo que entendi, agregação é a forma que eu recebo esse valor ou seja no set ou construtor.

public void setEndereco(Endereco endereco){
    this.endereco = endereco;
}

aproveitando, que tenho sua atenção, gostaria de parabeniza-lo pela iniciativa de vários exemplos e tutoriais de JPA e Hibernate,
me ajudaram e me ajudam bastante no dia a dia.

Se eu tiver entendido errado, aproveitando gostaria que você deixasse mais claro o meu entendimento.Rsss

[quote=gilluan]Não, Não. Pelo que entendi, agregação é a forma que eu recebo esse valor ou seja no set ou construtor.

public void setEndereco(Endereco endereco){
    this.endereco = endereco;
}

aproveitando, que tenho sua atenção, gostaria de parabeniza-lo pela iniciativa de vários exemplos e tutoriais de JPA e Hibernate,
me ajudaram e me ajudam bastante no dia a dia.

Se eu tiver entendido errado, aproveitando gostaria que você deixasse mais claro o meu entendimento.Rsss[/quote]Opa, valeu pelo apoio.
E como ficaria o set/construtor de um cara que utilize composição?

[quote=Hebert Coelho]Isso depende de como você irá utilizar.

Pessoa só pode ter um endereço? Um para Um
Pessoa pode ter vários endereços? Um para Muitos
Endereço poderá ter várias pessoas? Muitos para muitos

Isso vai do seu requisito. Você vai usar JPA? Se sim, aqui mostra como utilizar os relacionamentos acima:
JPA: Mini Livro - Primeiros passos e conceitos detalhados[/quote]

Muito legal sua mensagem…

Eu estou aprendendo assim também na faculdade.
Tipo depende de como o requisito está falando que tem que ser.

Eu gosto muito de fazer a mesma coisa das várias formas que pode ter no requisito
pois ajuda a abrir nossa mente para modos diferentes de ver as coisas.

Thanks

Composição ou agregação não é algo que vc escreve em código, e sim uma forma das classes se relacionarem. A composição também é chamada de “agregação forte” ou “relacionamento todo-parte” e se caracteriza por:

  • a existência de um depende da existência do outro. O objeto “parte” não tem existência solta, ele está sempre associado ao objeto “todo” (contêiner)
  • cada “todo” tem as suas “partes” associadas, não compartilha instâncias com outros
  • o todo e a parte são instanciados/destruídos juntos

O exemplo clássico é a Venda e seus Itens. Não há venda sem itens, e não há item sem venda. Cada item pertence a apenas uma venda.

Agora o relacionamento entre cliente e endereço será sempre de agregação, pois o cliente não é composto por um ou mais endereços. O endereço tem existência independente do cliente. O cliente pode mudar de endereço, ou pode morrer e deixar de existir. E o mesmo endereço pode ter vários clientes morando nele.

Fazendo um paralelo com os bancos de dados, um relacionamento um-para-muitos frequentemente é uma composição na orientação a objetos, mas nem sempre. Agora, um relacionamento muitos-para-muitos do banco de dados sempre será uma agregação no modelo de objetos.

[quote=Hebert Coelho][quote=gilluan]Não, Não. Pelo que entendi, agregação é a forma que eu recebo esse valor ou seja no set ou construtor.

public void setEndereco(Endereco endereco){
    this.endereco = endereco;
}

aproveitando, que tenho sua atenção, gostaria de parabeniza-lo pela iniciativa de vários exemplos e tutoriais de JPA e Hibernate,
me ajudaram e me ajudam bastante no dia a dia.

Se eu tiver entendido errado, aproveitando gostaria que você deixasse mais claro o meu entendimento.Rsss[/quote]Opa, valeu pelo apoio.
E como ficaria o set/construtor de um cara que utilize composição?[/quote]

public class Cliente{  
    private long id;  
    private String nome;  
    private Endereco endereco;  
   
  public Cliente(long id, String nome, Endereco endereco){
     this.id = id;
     this.nome = nome;
     this.endereco = endereco;

  }
 //getters e setters  
} 

estou fazendo errado?

Olá pessoal, obrigado pelas mensagens, estou tirando muitas dúvidas. No entanto sempre me surgem mais, em especial se tratando de modelagem. Deêm uma olhada no exercício e critiquem, os atributos, as classes, etc.