Domanda Problema gestione ArrayList di oggetti.

skarkyo

Utente Iron
15 Dicembre 2021
1
1
0
7
Ultima modifica da un moderatore:
Buonasera, mi approccio a Java da poco tempo e ho un problema che non riesco a risolvere, chiedo il vostro aiuto e ringrazio chiunque si renda disponibile.

Vi faccio un esempio pratico per rendere il tutto più comprensibile.
Ho creato 2 classi:
Automobile: con attributi marca, modello e una variabile booleana disponibilita.
Concessionario: con attributi nome e un ArrayList di tipo Automobile.

Nella classe Concessionario ho creato un metodo che aggiunge un automobile alla lista presente, e un metodo che passando in input un oggetto automobile setta la disponibilita su true.


Java:
public void Disponibilità(Autovettura macchina){
    if (auto.contains(macchina)) {
        auto.get(auto.indexOf(macchina)).setDisponibilita(true);
    }
}

Il problema è che nonostante io stia lavorando nella lista, quindi sto andando a modificare l'indice nella lista dove è presente l'oggetto in questione, la disponibilità viene settata per l'oggetto e non per l'oggetto solo in quella specifica lista , probabilmente in quanto l'oggetto viene passato per riferimento e quindi l'indirizzo di memoria che andiamo a modificare è lo stesso.
Dunque se io voglio creare 2 concessionari e inserire una macchina in entrambi ma settare la disponibilità nel concessionario 1 a true e nel concessionario 2 a false, non è possibile.

Esiste dunque un metodo pratico per modificare l'oggetto della lista solo per l'oggetto interessato?
Ho pensato che una soluzione sarebbe ogni volta che si vuole aggiungere una macchina alla lista di un concessionario, di creare un nuovo oggetto di tipo Autovettura copiando i valori dall'oggetto originale in modo tale da avere un altro oggetto con un altro indirizzo di memoria, ma mi sembra una soluzione poco pratica.

Chiedo scusa a tutti se non sono molto bravo ad esprimermi ma come ho detto, ho iniziato a studiare Java solo da un paio di settimane.
 
La butto li': se creassi una coppia chiave-valore in ogni concessionario in cui imposti la disponibilita' della/e vettura/e?

Mi spiego meglio:

L'auto potrebbe/dovrebbe avere anche un ID che la identifichi univocamente (oppure marca-modello come coppia).
Il concessionario ha una lista delle auto che vende, ma la disponibilita' non la devi salvare in automobile, ma in concessionario, poiche' ogni concessionario, come tu stesso hai detto, puo' averla o non averla disponibile.

Per far cio', in maniera elementare, potresti creare dentro ogni concessionario una mappa in cui per ogni auto dici se disponibile o meno
In tal modo potrai consultare la lista delle auto "trattate" dal concessionario (quella che stai gia' popolando) e una lista in cui salvi solo la disponibilita' nel concessionario specifico


Spero di aver reso l'idea
 
Vedila in questo modo:
  • classe automobile: marca, modello, targa e chilometraggio;
  • classe concessionario: nome e lista di automobili.
Facciamo finta che le automobili hanno già una targa (un numero random) quando sono dal concessionario. Il concessionario ha una Fiat Punto se nella lista delle automobili c'è un'automobile di targa qualsiasi che di marca fa Fiat e di modello fa Punto. Non ha più senso avere una variabile booleana per la disponibilità, è sufficiente la lista. Inoltre, ha perfettamente senso che esistano tante Fiat Punto (nello stesso concessionario o in concessionari diversi) con targa diversa. Quando tu compri un'automobile hai il tuo oggetto automobile con targa univoca. Se usi la tua automobile incrementi il chilometraggio del tuo oggetto automobile, non di tutte le Fiat Punto presenti sul pianeta.

Ho pensato che una soluzione sarebbe ogni volta che si vuole aggiungere una macchina alla lista di un concessionario, di creare un nuovo oggetto di tipo Autovettura copiando i valori dall'oggetto originale in modo tale da avere un altro oggetto con un altro indirizzo di memoria, ma mi sembra una soluzione poco pratica.
Dipende da cosa stai sviluppando, ma in linea puramente concettuale/didattica la mia Fiat Punto è diversa dalla tua Fiat Punto. Hanno la stessa marca e lo stesso modello, ma se io mi schianto con la mia automobile la tua rimane intatta (amenoché non ti colpisco). Sono oggetti diversi.

D'altro canto la disponibilità non è una caratteristica delle automobili, è una caratteristica che lega le automobili al concessionario.