Problema gestione ArrayList di oggetti

di il
3 risposte

Problema gestione ArrayList di oggetti

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.

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.

3 Risposte

  • Re: Problema gestione ArrayList di oggetti

    Socrate ha scritto:


    
    	public void Disponibilità(Autovettura macchina){
    		if (auto.contains(macchina)) {
    			auto.get(auto.indexOf(macchina)).setDisponibilita(true);
    		}
    	}
    Attenzione innanzitutto al fatto che contains e indexOf delle liste si basano sul concetto di "uguaglianza" degli oggetti, ovvero: metodo equals(Object) di Object. Che nella tua classe della automobile potrebbe essere stato ridefinito opportunamente oppure no (non lo posso sapere ...).

    Socrate ha scritto:


    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.
    Per lo stesso oggetto "condiviso" tra due concessionari, così no.

    Socrate ha scritto:


    Esiste dunque un metodo pratico per modificare l'oggetto della lista solo per l'oggetto interessato?
    La questione è un po' più ampia. La prima domanda potrebbe essere: perché devi mettere lo stesso oggetto in due concessionari diversi? Basterebbe usare oggetti automobile distinti.

    Se invece si vuole proprio usare lo STESSO oggetto, altre soluzioni sì, ci sono: cambiare architettura, ovvero usare un altro modo nel concessionario per rappresentare la "disponibilità", che non sia incapsulato dentro automobile.
  • Re: Problema gestione ArrayList di oggetti

    andbin ha scritto:


    Socrate ha scritto:


    
    	public void Disponibilità(Autovettura macchina){
    		if (auto.contains(macchina)) {
    			auto.get(auto.indexOf(macchina)).setDisponibilita(true);
    		}
    	}
    Attenzione innanzitutto al fatto che contains e indexOf delle liste si basano sul concetto di "uguaglianza" degli oggetti, ovvero: metodo equals(Object) di Object. Che nella tua classe della automobile potrebbe essere stato ridefinito opportunamente oppure no (non lo posso sapere ...).

    Socrate ha scritto:


    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.
    Per lo stesso oggetto "condiviso" tra due concessionari, così no.

    Socrate ha scritto:


    Esiste dunque un metodo pratico per modificare l'oggetto della lista solo per l'oggetto interessato?
    La questione è un po' più ampia. La prima domanda potrebbe essere: perché devi mettere lo stesso oggetto in due concessionari diversi? Basterebbe usare oggetti automobile distinti.

    Se invece si vuole proprio usare lo STESSO oggetto, altre soluzioni sì, ci sono: cambiare architettura, ovvero usare un altro modo nel concessionario per rappresentare la "disponibilità", che non sia incapsulato dentro automobile.
    Grazie per la risposta! Scusami non so come citare ti rispondo per punti:
    1) Sull'contains e l'indexof si infatti verifico semplicemente che tale oggetto sia presente nella lista (non mi sono posto il problema di un'eventuale ridefinizione)

    2) Infatti perché il problema è proprio il fatto che rimane essere lo stesso oggetto se pur inserito in due liste diverse di due oggetti diversi.

    3) Perché se io ad esempio creo un oggetto automobile per esempio: bmw x5 1000cavalli 500cc ecc.. Questa stessa automobile può essere presente in più concessionari, magari avente un prezzo diverso in base a quale concessionario la vende. Oppure dovrei strutturare il tutto in modo diverso?

    4) Ok chiarissimo, ma del tipo? Se ho una lista di tipo automobile presente nella classe concessionario, come posso associare ad ogni oggetto presente in tale lista un attributo aggiuntivo che mi rappresenta la disponbilità?
  • Re: Problema gestione ArrayList di oggetti

    Socrate ha scritto:


    1) Sull'contains e l'indexof si infatti verifico semplicemente che tale oggetto sia presente nella lista (non mi sono posto il problema di un'eventuale ridefinizione)
    Forse non hai compreso quanto dicevo .... il equals() implementato in Object si basa solo sulla "identità" degli oggetti (cioè this == altroOggetto).
    Questo significa che se nel concessionario metti un oggetto Automobile X ma poi al metodo Disponibilità passi un altro oggetto Automobile Y che è distinto da X ma con gli stessi dati, non te lo troverà!

    Ridefinire opportunamente equals permette di definire il concetto di uguaglianza basandosi sul contenuto degli oggetti invece della loro identità.

    Socrate ha scritto:


    3) Perché se io ad esempio creo un oggetto automobile per esempio: bmw x5 1000cavalli 500cc ecc.. Questa stessa automobile può essere presente in più concessionari, magari avente un prezzo diverso in base a quale concessionario la vende.
    Quando si fa una classe tipo l'Automobile c'è sempre la questione di che cosa rappresenta: 1) il concetto generico di un modello? Oppure 2) una automobile concreta ben precisa?
    Se rappresenta solo un modello generico, è ovvio che più concessionari lo possono avere. Se rappresenta una automobile concreta (perché magari ci metti anche la targa) ... è ovvio che NON può essere condivisa.
    Da quanto dici, deduco che è il caso 1).

    Socrate ha scritto:


    4) Ok chiarissimo, ma del tipo? Se ho una lista di tipo automobile presente nella classe concessionario, come posso associare ad ogni oggetto presente in tale lista un attributo aggiuntivo che mi rappresenta la disponbilità?
    Il concessionario può clonare l'Automobile ogni volta che ne riceve una da inserire.
    Altrimenti bisogna cambiare la struttura dati, tipo:

    1) Invece di un List<Automobile> fai un List<AutoConcessionario> dove AutoConcessionario è una classe con 2 dati: un riferimento ad Automobile e il flag disponibilità. Questo ovviamente cambia anche la logica di ricerca.

    2) Se Automobile fosse "immutabile" (non lo posso sapere come l'hai fatta), lo puoi usare come "chiave" in una mappa Map<Automobile,Boolean> da affiancare (o sostituire) alla lista.
Devi accedere o registrarti per scrivere nel forum
3 risposte