Autore Topic: Variabili globali modificate  (Letto 781 volte)

Offline elcaurro

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Motorola Atrix, nexus 7, Tab A2, Tab S2
  • Sistema operativo:
    Mac OsX
Variabili globali modificate
« il: 23 Marzo 2012, 16:57:12 CET »
0
Salve amici... vi spiego il mio problema: non è la prima volta che uso le variabili globali:

Codice (Java): [Seleziona]
public class MyApp extends Application{

        private ArrayList<Apk> applicazioni;

        public ArrayList<Apk> getApplicazioni() {
                return applicazioni;
        }

        public void setApplicazioni(ArrayList<Apk> applicazioni) {
                this.applicazioni = applicazioni;
        }
}

ma questa volta mi sono accorto di un problema... in un'Activity salvo in una variabile locale il contenuto di applicazioni (la variabile locale è apps)

Codice (Java): [Seleziona]
MyApp oa = ((MyApp)getApplicationContext());
ArrayList<Apk> apps=oa.getApplicazioni();

ma se rimuovo un elemento da apps, esso sparisce anche dalla variabile globale applicazioni... è normale? Io vorrei che la variabile globale venga modificata solo se uso setApplicazioni e che le copie locali di essa siano modificabili senza che le modifiche si ripercuotano sulla loro "fonte".

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Variabili globali modificate
« Risposta #1 il: 23 Marzo 2012, 17:12:55 CET »
0
getApplicazioni ti ritorna un riferimento all'oggetto globale applicazioni, non una copia di tutto l'oggetto.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Mr.Donut

  • Utente junior
  • **
  • Post: 67
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Lg Optimus Chat
  • Sistema operativo:
    Ubuntu 11.04
Re:Variabili globali modificate
« Risposta #2 il: 23 Marzo 2012, 19:08:46 CET »
0
getApplicazioni ti ritorna un riferimento all'oggetto globale applicazioni, non una copia di tutto l'oggetto.

Come dice Bradipao tu non hai una copia, ma il riferimento all'oggetto globale.

Se vuoi fare come dici tu ti consiglierei di avere una copia dello stesso oggetto e di lavorare su quello aggiornandolo ogni volta che ti serve.

Offline elcaurro

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Motorola Atrix, nexus 7, Tab A2, Tab S2
  • Sistema operativo:
    Mac OsX
Re:Variabili globali modificate
« Risposta #3 il: 26 Marzo 2012, 10:19:54 CEST »
0
Se vuoi fare come dici tu ti consiglierei di avere una copia dello stesso oggetto e di lavorare su quello aggiornandolo ogni volta che ti serve.

Mi potete fare un esempio di come procedere?

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Variabili globali modificate
« Risposta #4 il: 26 Marzo 2012, 12:01:04 CEST »
0
Fermo restando la corretta precisazione di Bradipao sui puntatori, io aggiungerei un getter che mi torna un clone della lista originale:

Codice (Java): [Seleziona]
public class MyApp extends Application{

        private ArrayList<Apk> applicazioni;

        public ArrayList<Apk> getApplicazioni() {
                return applicazioni;
        }

        public ArrayList<Apk> getApplicazioniCopy() {
                return (ArrayList<Apk>)applicazioni.clone();
        }

        public void setApplicazioni(ArrayList<Apk> applicazioni) {
                this.applicazioni = applicazioni;
        }
}

E userei quello per recuperare la lista

Codice (Java): [Seleziona]
MyApp oa = ((MyApp)getApplicationContext());
ArrayList<Apk> apps=oa.getApplicazioniCopy();

a questo punto se aggiungi o rimuovi da apps non modifichi la lista originaria.

NB: occhio però che se modifichi gli Apk presenti nella lista la modifica te la ritrovi anche nella lista originaria, perché sono di fatto gli stessi oggetti!

Offline elcaurro

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus One, Motorola Atrix, nexus 7, Tab A2, Tab S2
  • Sistema operativo:
    Mac OsX
Re:Variabili globali modificate
« Risposta #5 il: 28 Marzo 2012, 12:00:04 CEST »
0
Grazie mille  :-)