lunedì 9 luglio 2012

Java pass by value

Il linguaggio Java utilizza solo la metodologia "pass by value".
E' una delle prime nozioni che si apprendono ai corsi di Java ma spesso capita di trovare errori in merito.
Nel  caso di semplici variabili è tutto molto chiaro, esempio classico:

public void badSwap(int var1, int var2)
{
  int temp = var1;
  var1 = var2;
  var2 = temp;
}

Chiamando questo codice non si effettuerà mai lo scambio di variabile perchè i parametri passati in input sono delle copie degli originali.

Quindi facendo

....
int a=5;
int b=6;
badSwap(a,b);
System.out.println(a);
System.out.println(b);
.....

Sarà stampato sempre 5 per a e 6 per b.

Per gli oggetti vale lo stesso principio, ossia il puntatore passato è una copia di quello originale, solo che, essendo oggetti, la modifica si rifletterà sull'oggetto sottostante , a meno di reinizializzazioni dell'oggetto nel metodo.

Vediamo un esempio:

private void alterList1(ArrayList l)
{
        l.add("a");
        l.add("e");
        l.add("i");
        l.add("o");
        l.add("u");
}

Se lo chiamiamo da questo main:

public static void main(String[] args) {
        TestPassByVal t=new TestPassByVal();
        ArrayList l=new ArrayList();
        l.add("b");
        l.add("c");
        t.alterList1(l);
        System.out.println(l);

    }

Il risultato sarà:

[b, c, a, e, i, o, u]

Se invece nel metodo si reinizializza l'oggetto allora le cose cambiano.

private void alterList2(ArrayList l)
{
        l=new ArrayList();
        l.add("a");
        l.add("e");
        l.add("i");
        l.add("o");
        l.add("u");
}

In questo caso lo stesso main, se chiamasse il metodo alterList2 avrebbe come risultato
[b,c].
E' evidente il motivo, essendo Java sempre pass by value il puntatore all'oggetto ArrayList nel metodo è una copia dell'originale; se non è reinizializzato allora i 2 puntatori sono legati allo stesso oggetto e le modifiche nel metodo si ripercuotono nell'oggetto stesso, altrimenti no.

Nessun commento:

Posta un commento