2012-01-10 2 views
0

요소 현재 내부 컬렉션에 대한 나던 작업 : 합니까 자바 "참조로 패스"나는 내가 다음과 같이 얻을 목록을

List<MyObject> list = complexObject.getMyObjectList(); 
for(final MyObject obj in list){ 
    // set something in obj. .............(1) 
} 

나는 위의 코드를 디버깅하고 수정을 MyObject 년대는 발견 보였다 다음과 같이하지 않으면 complexObject에 반영되지 않습니다.

complexObject.setList(list); 

Java는 "Pass by reference"로 모든 것을 수행한다고 생각했습니다. 나는 뭔가를 놓친다. ?

+3

'getMyObjectList()'의 구현을 알고 있습니까? 어쩌면 깊은 사본을 돌려 줄 수 있습니다. –

+2

Java는 "값으로 참조를 전달합니다". –

+2

Java가 참조로 전달되지 않습니다. (일부 사람들은 틀린 말을하고 있지만 틀린 사람을 제외하고는 "참조로 전달"이라는 용어를 확장합니다.) 수많은 다른 질문을보십시오. "obj에서 뭔가 설정하기"는'obj = ...'일까요? – delnan

답변

2

을 반환하기 전에 목록의 깊은 복사본을 할 수있는 getMyObjectList() 기능의 구현 :

protected List<MyObject> objects = new ArrayList<MyObject>(); 
// ... 
public List<MyObject> getMyObjectList() { 
    List<MyObject> os = new ArrayList<MyObject>(); 
    for (Object o: this.objects) { 
     os.add(o.clone()); 
    } 
    return os; 
} 

이 목록 및/또는 목록의 구성원 돌연변이 실수하지 않도록하는 일반적인 관용구입니다.

+0

그러나 그 관용구를 사용하더라도 여전히 목록 안의 개체 *에 액세스 할 수 있습니다. 또한, 사고를 막기 위해'Collections.unmodifiableList()'를 사용하는 것이 좋다. –

+0

이것은 얕은 사본입니다. 'getMyObjectList()'에 의해 반환 된리스트 내의 임의의 MyObject를 변경하는 것은 여전히'objects'에서 참조 된 객체를 변경해야합니다. –

+0

이것은 OP 문제를 설명하지 못합니다. getMyObjectList는 목록의 객체도 복제해야합니다. –

0

java에서 myObject와 같은 변수는 object에 대한 참조를 보유합니다.

public MyClass myObject = new MyClass(); 
foo(myObject); 

public void foo(MyClass _obj) 
{ 
    //some code here 
} 

당신이 함수에 즉, myObject 변수를 전달한다면, 즉, myObject의 값이 값에 의해 전달

. 그러나 myObject 변수의 사본은 myObject와 동일한 객체를 표시합니다. _obj와 myObject의 값은 "객체 참조"와 같습니다.

관련 문제