Foo.java 1/3

[
top][prev][next]

import java.util.LinkedList;
import java.util.List;

/* In Java, si puo' accedere all'istanza dell'oggetto esclusivamente tramite
 riferimento. Di conseguenza pippo e pluto sono esclusivamente dei
 riferimenti e quindi l'istruzione pluto = pippo non fa null'altro che
 copiare l'indirizzo contenuto in pippo in pluto ma non duplica il contenuta
 della cella puntata da a. Eseguendo il programma si puo' verificare
 facilmente che pippo e pluto contengono lo stesso indirizzo */

public class Foo {
	private int a;

	private List list;

	public Foo(int a, List list) {
		this.a = a;
		this.list = list;
	}

	public Foo(List list) {
		this.a = 0;
		this.list = list;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list = list;
	}

	public void addList(Integer integer) {
		list.add(integer);
	}

	public static void main(String[] args) {
		Foo pippo = new Foo(5, new LinkedList());

		Foo pluto = pippo;

		pluto.setA(25);

		pippo.setA(7);

		System.out.println("pippo (" + pippo + "): list vale "
				+ pippo.getList() + " e a vale " + pippo.getA());
		System.out.println("pluto (" + pluto + "):list vale " + pluto.getList()
				+ " e a vale " + pluto.getA());

	}

}

DeepCopy.java 2/3

[
top][prev][next]
/* La soluzione definitiva consiste nel ridefinire il metodo clone per adattarlo
 * alle nostre esigenze, duplicando anche l'oggetto list. Eseguendo il programma,
 * si puo' verificare che anche i due oggetti List sono effettivamente distinti.
 */

import java.util.LinkedList;
import java.util.List;

public class DeepCopy implements Cloneable {
	private int a;

	private List list;

	public DeepCopy(int a, List list) {
		this.a = a;
		this.list = list;
	}

	public DeepCopy(List list) {
		this.a = 0;
		this.list = list;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list = list;
	}

	public void addList(Integer integer) {
		list.add(integer);
	}

	protected Object clone() throws CloneNotSupportedException {
		DeepCopy p = new DeepCopy(this.getA(), new LinkedList(this.getList()));

		return p;
	}

	public static void main(String[] args) {
		DeepCopy pippo = new DeepCopy(5, new LinkedList());

		DeepCopy pluto;
		try {
			pluto = (DeepCopy) pippo.clone();

			pluto.setA(25);

			pippo.setA(7);

			pluto.addList(new Integer(5));
			pippo.addList(new Integer(49));

			System.out.println("pippo (" + pippo + "): list vale "
					+ pippo.getList() + " e a vale " + pippo.getA());
			System.out.println("pluto (" + pluto + "):list vale "
					+ pluto.getList() + " e a vale " + pluto.getA());

		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}

	}

}

Clone.java 3/3

[
top][prev][next]
/* Una soluzione al problema evidenziato nell'esercizio precedente
 * consiste nell'utilizzare il metodo clone() che esegue una copia bit 
 * a bit dell'oggetto (NB: ricordarsi di aggiungere "implements Cloneable" 
 * alla dichiarazione della classe altrimenti viene generata l'eccezione 
 * CloneNotSupportedException a run-tim. Questa soluzione si rivela corretta 
 * per gli attributi di tipo primitivo (a in questo caso): posso modificare il valore di a di pippo
 * senza influenzare il valore di a di pluto perch? sono due celle diverse. Tuttavia
 * questa soluzione non funziona per i tipi di dato strutturati (list nell'esempio): 
 * infatti una copia bit a bit copia il valore della reference ma non duplica l'oggetto.
 * In altre parole viene duplicata la reference ma entrambi gli oggetti fanno riferimento 
 * allo stesso oggetto List */

import java.util.LinkedList;
import java.util.List;

public class Clone implements Cloneable {
	private int a;

	private List list;

	public Clone(int a, List list) {
		this.a = a;
		this.list = list;
	}

	public Clone(List list) {
		this.a = 0;
		this.list = list;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list = list;
	}

	public void addList(Integer integer) {
		list.add(integer);
	}

	public static void main(String[] args) {
		Clone pippo = new Clone(5, new LinkedList());

		Clone pluto;
		try {
			pluto = (Clone) pippo.clone();

			pluto.setA(25);

			pippo.setA(7);

			pluto.addList(new Integer(5));
			pippo.addList(new Integer(49));

			System.out.println("pippo (" + pippo + "): list vale "
					+ pippo.getList() + " e a vale " + pippo.getA());
			System.out.println("pluto (" + pluto + "):list vale "
					+ pluto.getList() + " e a vale " + pluto.getA());

		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}

	}

}

Generated by GNU enscript 1.6.4.