2017-12-14 13 views
0

So erlebt ich wirklich massiven Speicher und CPU-Leakage auf meinem Swing-Programm und erkannte, dass ich nicht absolut alles Notwendige auf dem EDT ausführte, aber dumm genug war, alles in Methoden zu übergeben Schließlich erkannte ich, dass ich Objekte und ihre 2000-Arrays aufgrund der "Pass-by-Value" -Regel vervielfältigte.Durch Referenz in einen Setter

Meine Frage ist, für den folgenden Code:

public class Test { 
    Object obj = new Object(); 
    public void setOBJ(Object obj) { 
     this.obj = obj; 
    } 
} 

es this.obj auf eine neue Instanz von obj gesetzt Ist, oder der Verweis auf obj?

Darüber hinaus tut es dies in alle Fall oder gibt es bestimmte Umstände, wo der eine oder andere passieren kann? Ich würde das versuchen, weiß aber nicht, wo ich anfangen soll und in welchen Fällen es passieren kann.

Schließlich ändert sich im Multithreading etwas, oder wird es immer noch auf die gleiche Weise passieren? Nur neugierig um ehrlich zu sein.

+1

"Wird' this.obj' auf eine neue Instanz von 'obj' oder die Referenz auf' obj' gesetzt? " -> es gibt den Verweis auf das Objekt zurück, keinen Klon. "Außerdem, tut es das in jedem Fall" -> ja, du übergibst immer die Referenz. "Ändert sich beim Multithreading wirklich irgendetwas, oder wird es immer noch auf die gleiche Weise passieren?" -> Ja, auch in Multithread-Umgebungen werden Referenzen an Methoden übergeben. – Turing85

+0

Werfen Sie einen Blick auf [diesen Link] (https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) TL; DR: Sie kopieren nur eine Referenz auf Dieses Objekt klont Sie nicht. Ihr Programm ist aus einem anderen Grund langsam. –

+0

@ Turing85 Vielen Dank! – finnrayment

Antwort

2

setOBJ(Object obj) ordnet eine Referenz von Object zu this.obj zu. Es erstellt keine neue Instanz.

Auf der anderen Seite, die jeweils Sie Zeit, um eine neue Instanz von Test, eine neue Instanz erstellen Object wird auch obj (als Folge der Object obj = new Object();) erstellt und zugewiesen.

Die Frage ist, wie oft Sie setOBJ aufrufen, und ob jedes Mal, wenn Sie eine neue Object Instanz übergeben. Wir können es nicht an dem von Ihnen geposteten Code erkennen.

+0

Oh nein, das ist in Ordnung. Ich weiß, dass ich überall Probleme mit dem Array habe, aber ich versuche nur, sie herauszufiltern. Wenn es nur Pass-by-Reference ist, dann schätze ich, dass ich an der falschen Stelle suche. Vielen Dank! :) – finnrayment

+0

Darf ich bitte fragen, sind Getter auch pass-by-value? – finnrayment

+1

@finnrayment Fragen Sie, ob ein Getter bei jedem Aufruf eine neue Instanz erstellt? Im Allgemeinen wird dies nicht ausgeführt, es sei denn, es enthält Code, der eine neue Kopie der Instanz erstellt, die Sie abrufen möchten, und gibt einen Verweis auf diese Kopie zurück. – Eran