Clone()

Ich habe in einem Übungs-Programm aus einem Buch die folgende Methode:

public synchronized ArrayList getPrimes()
{
if(isDone())
{
return(primesFound);
}
else
{
return((ArrayList)primesFound.clone());
}
}

Ich weiß nicht, ob es ohne Kenntnis des gesamten Programms möglich ist, eine Prognose zu wagen (weshalb ich gleich noch ein paar weitere Methoden auszugsweise mitliefere). Ich verstehe den Unterschied bei den Rückgaben nicht. Im ersteren Fall (if) wird eine ArrayList namens primesFound zurückgegeben. Im zweiten (else) Fall, wird die Kopie der ArrayList zurückgegeben. Wo ist denn da der Unterschied?

Noch einige weitere Methoden aus derselben Klasse des Programms:

public PrimeList(int numPrimes, int numDigits, boolean runInBackground)
{
primesFound = new ArrayList(numPrimes);
this.numPrimes = numPrimes;
this.numDigits = numDigits;
if(runInBackground)
{
Thread t = new Thread(this);
// Geringe Priorität, um den Server nicht auszubremsen
t.setPriority(Thread.MIN_PRIORITY);
t.start();
}
else
{
run();
}
}

public void run()
{
BigInteger start = Primes.random(numDigits);
for(int i=0; i

Hi Lars,
ich will die jetzt nichts falsches erzählen, ich bin mit nämlich nicht ganz sicher:
Diese Arraylist ist glaub ich ziemlich stark an dieser „Zeigerverkettung“ von c++ orientiert. Wenn du da die Arraylist zurückgibst und anschließend veränderst, verändert sich auch das original. D.H normalerweise gibt man ja parametervariablen an, die man auch verändern kann, da es sich dabei ja um eine Kopie des Originals handelt. Wenn du eine Arraylist übergibst, wird nicht mit einer Kopie gearbeitet.
Damit doch mit einer Kopie gearbeitet wird, setzt man die Funktion clone() ein. Die dubliziert die Arraylist und wenn diese Kopie jetzt verändert wird, tut das nix dem Original.
Mehr kann ich dir leider auch nicht sagen, viele Grüße
Manny

Hallo.

Wenn ich das richtig sehe, werden da Primzahlen berechnet. Die Berechnung läuft in einem eigenen Thread (falls runInBackground == TRUE), also parallel zum Rest des Programms. Wird getPrimes() aufgerufen, werden die bisher gefundenen Primzahlen zurückgegeben.
Währenddessen läuft aber die Berechnung weiter. Damit sich jetzt die zurückgelieferte Liste nicht ändert, wird nur eine Kopie zurückgegeben.
Außerdem wird so verhindert, dass in der Methode, aus der getPrimes() aufgerufen wird, die Ergebnisliste verändert wird, da ja alle Änderungen nur an der Kopie stattfinden.
Erst wenn die Berechnung abgeschlossen ist, wird darauf verzichtet, die Liste zu kopieren, da sich dann die Threads ja nicht mehr gegenseitig stören können (der Berechnungs-Thread ist ja beendet).

Sebastian.