2017-12-14 4 views
0

그래서 스윙 프로그램에서 누출되는 엄청난 메모리와 CPU를 경험하고 EDT에서 필요한 모든 것을 절대 실행하지 않고 모든 것을 메서드에 전달할 정도로 어리 석다는 것을 깨달았습니다. 결과적으로 "pass-by-value"규칙 때문에 객체와 2000 배열을 복제한다는 것을 알게되었습니다.setter로 참조로 전달

내 질문은, 다음과 같은 코드 :

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

그것이 obj의 새로운 인스턴스 또는 obj에 대한 참조로 this.obj를 설정합니까?

더욱이 건마다 또는 이와 비슷한 경우가 발생할 수 있습니까? 나는 이것을 시도 할 것이지만 어디서부터 시작될 수 있는지 그리고 어떤 경우에 일어날 지 모른다.

마지막으로, 멀티 스레딩에서, 어떤 것이 바뀌거나 여전히 같은 방식으로 전달 될 것인가? 솔직히 호기심이 많습니다.

+1

"'this.obj'를'obj'의 새로운 인스턴스 또는'obj'에 대한 참조로 설정합니까?" -> 복제본이 아닌 객체에 대한 참조를 반환합니다. "게다가, 모든 경우에이 작업을 수행합니까?"-> 예, 항상 참조를 전달합니다. "내부적으로, 멀티 스레딩에서 무엇이 변경 되나요? 아니면 여전히 같은 방식으로 진행될 것입니까?" -> 예, 다중 스레드 환경에서도 참조가 메소드에 전달됩니다. – Turing85

+0

[이 링크] (https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) TL; DR : 참고 문헌 만 복사하십시오. 이 객체는 복제하지 않습니다. 프로그램이 다른 이유로 느립니다. –

+0

@ Turing85 대단히 감사합니다! – finnrayment

답변

2

setOBJ(Object obj)Object에서 this.obj까지의 참조를 할당합니다. 새 인스턴스를 만들지 않습니다. 한편

은, 당신이 Test의 새 인스턴스를 만들 때마다 새로운 Object 인스턴스도 생성하고 ( Object obj = new Object();의 결과로) obj에 할당.

질문은 setOBJ에 전화 한 횟수와 새 Object 인스턴스를 전달할 때마다 발생하는지 여부입니다. 게시 한 코드로는 알 수 없습니다.

+0

오, 아니, 괜찮습니다. 내가 배열 문제를 가지고있는 것을 알고 있지만, 나는 그들을 하나씩 꺼내려고 노력하고있다. 그것이 단지 참고 지나면 나는 틀린 장소에서보고 있다고 생각한다. 고맙습니다. :) – finnrayment

+0

물어봐도 될까요, getters도 가치에 의해 전달됩니까? – finnrayment

+1

@finnrayment getter가 호출 될 때마다 새 인스턴스를 생성하는지 묻는 중입니까? 일반적으로 얻으려는 인스턴스의 새 복사본을 만드는 코드가 포함되어 있지 않으면 해당 복사본에 대한 참조가 반환됩니다. – Eran