Verweis oder neues Objekt?

Fohnbit

Top Contributor
Hallo,

auch wenn es ein Anfänger Thema ist.
Ich habe:
Java:
private LimitedQueue<String> failedUploads = new LimitedQueue<String>(10000);
...
bla bla
...
LimitedQueue<String> test = new LimitedQueue<String>(10000);
test.addAll(failedUploads);
HttpPost httpost = new HttpPost(getPropertyUrl()
                    + "/input/bulk.json", test, this, getPropertyApikey());
failedUploads.clear();

Ist die Übergabe an die Klasse HttpPost auf die Variable "failedUploads" nun ein Verweis oder ein neues Objekt?

Wenn ich nämlich "failedUploads" nicht zuerst in die neue "test" lege, arbeitet die HttpPost Klasse mit einer leeren Liste.

Demnach wird beim Aufruf also ein Verweis/Zeiger gesetzt, oder?
 
Nein, das meint er nicht.
Mit new werden immer neue Objekte erzeugt, welche im sogenannten Heap gespeichert werden.
Java:
Object obj = new Object();
Hier wird nun ein neues Objekt erzeugt und die Variable obj ist eine Referenz welche auf das neu erzeugte Objekt zeigt.
Wenn du diese nun an eine Methode übergibst, so wird zwar die Referenz kopiert, sie zeigt aber immer noch auf das gleiche Objekt.
Java:
void test(Object x) { ... }
// ...
test(obj);
Die Variablen x und obj zeigen also beide auf das gleiche Objekt
 
Na ja, du erzeugst erst failedUploads, was eine List bzw Queue ist. Dann erzeugst du Test was eine weitere Queue ist und fügst alles von failedUploads ein. Dann übergibst du Test an den HttpPost. Dabei wird eine Referenz übergeben. Jetzt leerst du die failedUploads was aber nicht die Test leert, da Test eine neue Liste ist mit den selben Objekten. Würde Test nicht als Referenz übergeben werden, dann könntest du sie auch leeren, da eine Kopie gemacht wird.
 
Hallo,

oh, das habe ich dann Missverstanden. So wie du es beschrieben hast, hatte ich es eh gemeint.
Also nur primitive Datentypen werden kopiert: OK

Aber wie ist es in meinem konkreten Fall:
Ich starte einen neuen Thread und übergebe im Konstruktor eine Liste.
Java:
HttpPost httpost = new HttpPost(getPropertyUrl()
                    + "/input/bulk.json", test, this, getPropertyApikey());

Demnach wäre "test" nur ein Pointer und wenn ich im Thread die übergebene Variable bearbeite, bearbeite ich eigentlich die in der Main Klasse.
Somit habe ich ein concurrent Problem, oder?
Da sowohl die Klasse sowie der neue Thread auf das selbe Objekt zugreifen?

Das würde eine Exception nun erklären, die ich mal hatte.

Danke für Eure Hilfe!
 
Jip, du hast kein Concurrency Problem. An der Stelle hat Java selbst ein paar Thread safe Collections die vielleicht helfen.

Normal bekommt man einen ConcurrentModificationException.
 

Zurück
Oben