25 novembre 2008

Come clonare un oggetto Java

Un giorno mi sono imbattuto in un problema alquanto strano, in cui magari si sarà imbattuto chi, come me, ha iniziato a programmare in linguaggi come C o C++ in cui la referenza agli oggetti e il relativo passaggio parametri per valore o per riferimento essendo esplicito era facilmente gestibile.
In Java tutti gli oggetti vengono passati per riferimento, tranne alcuni come le Stringhe ad esempio, per cui ci si può imbattere nell'utilizzo di uno stesso bean in più contesti. Il problema si presenta nel caso in cui venga modificato il valore di qualche proprietà del bean in una parte remota del codice, quindi in tutti i contesti lo stesso viene utilizzato presenterà tali informazioni variate. In alcuni casi è necessario quindi eseguire una copia dell'oggetto. Per questo ci torna utile il metodo Clone.

Il metodo clone per gli Object è di tipo protected, quindi richiamare il metodo clone su un qualsiasi oggetto porta ad un problema di compilazione. E' necessario in primo luogo ridefinire il metodo clone , in secondo luogo implementare l'interfaccia Clobeable in modo tale da non incorrere in un eccezione di tipo CloneNotSupportedException. Il codice corretto risulta quindi:
class A implements Cloneable {
private int x;
public A(int i) {
x = i;
}
public Object clone() {
try {
return super.clone();
}
catch (CloneNotSupportedException e) {
throw new InternalError(e.toString());
}
}
public int getx() {
return x;
}
}

public class CloneDemo3 {
public static void main(String args[])
throws CloneNotSupportedException {
A obj1 = new A(37);
A obj2 = (A)obj1.clone();
System.out.println(obj2.getx());
}
}



Nessun commento: