[RESOLVIDO] Um objeto pode ser atributo de outro?

Pessoal, to fazendo um trabalho de POO sobre uma locadora de carros (bem basicão) e surgiu uma duvida. Bem, quando um cliente aluga um carro de que forma eles ficariam “associados”? Eu pensei e implementei a seguinte, um array de carros como atributo do cliente e sempre que ele aluga um carro o array é preenchido com objetos “Carro”, a duvida é eu posso fazer isso? sintaticamente eu sei que sim mas a “OO” deixa?

1 curtida

Deixa. Não há problema algum.

class Carro {}

class Cliente {
    Carro carroAlugado;
}

class Locadora {
    Carro[] carros = new Carro[100];
}
1 curtida

Valeu, no meu caso eu não coloquei a classe Locadora, fiz assim:

public class Cliente {
    private String nome;
    private String cpf;
    private Date dataDeNascimento;
    private String telefone;
    private ArrayList <Carro> carros = new ArrayList<Carro>();
    
    public void alugarCarro(Carro carro){
        if(carro.disponibilidade()){
            carros.add(carro);
            carro.setDisponibilidade(false);
        }
        else{
            System.out.println("Carro Indisponivel!");
        }
    }
1 curtida

Ah sim, no caso, cada cliente pode alugar mais de um carro ao mesmo tempo, né?

Acho que faz sentido do seu jeito sim. Só uma coisa:

Quando usar ArrayList e afins, prefira a versão genérica deles. Substitua isso:

private ArrayList carros = new ArrayList();

Por isso:

private ArrayList<Carro> carros = new ArrayList<>();

1 curtida

Não me parece fazer sentido a lista de carros ser atributo do Cliente.
No mundo real eu não tenho uma coleção de carros para alugar.
Se eu quiser alugar um Carro, vou na locadora e eles me farão a Locação de um Carro (ou mais de um?) .
Me parece fazer mais sentido ter uma classe Locação com dois atributos: um do tipo Cliente e outro do tipo Carro.

1 curtida

Fiz +/- assim, a Locadora tem o método de alugarCarros que recebe um Cliente e um Carro, porem o cliente ainda tem a lista de carros, dessa forma um objeto cliente vai ta associado a um ou mais objetos carro, não ta certo?

A terminologia já está errada. Orientação a Objetos trata-se de abstrair o mundo real para sua situação. Um cliente pode ALUGAR diversos carros, certo? Então, um cliente pode ter uma lista de carros. Mas eu faria diferente: Um cliente pode ter uma lista de Locações. Pense nisso.

1 curtida

Digo mais:

private List<Carro> carros = new ArrayList<>();

3 curtidas

Quando eu falei “associado” não quis dizer necessariamente a associação da modelagem de dados, por exemplo: se um cliente “Anderson” alugou um carro “Corsa” de que forma eu faria pra manter esses dois objetos unidos? Digo, como o meu “sistema” lidaria com isso se não do jeito que eu pensei. Essa parte da abstração ainda ta bem nebulosa pra mim, mas nesse contexto de locadora não faria sentido um Cliente ter uma lista de Carros?

Anderson tem uma lista de locações. Em uma locação, existe um objeto carro, pois todo Cliente faz a Locação de um Carro.

Pode fazer sentido se você não pensar que o cliente não tem um carro, ele aluga. Ele tem uma lista de Locações, que por sua vez possui como atributo um objeto carro. Toda vez que ele quer alugar um carro, ele inicia uma nova locação. Obrigatoriamente, toda locação está atribuída a um carro. Deu pra entender melhor?

1 curtida

Agora sim eu entendi, muito obrigado por esclarecer essa dúvida.