2010-06-15 5 views
1

질문 있습니다. 어떤 것은 아래의 코드에 관해서 잘못 :대상 재활용에 관한 질문

ArrayList tempList2 = new ArrayList(); 
tempList2 = getXYZ(tempList1, tempList2); 

//method getXYZ 
getXYZ(ArrayList tempList1, ArrayList tempList2) { 

    //does some logic and adds objects into tempList2 

    return tempList2; 
} 

코드가 실행 얻을 것이다하지만, 그것은 개체 재활용을하고있는 getXYZ 방법 인수에 tempList2를 전달하여 보인다.

내 질문은, tempList2 arraylist 개체를 올바르게 재활용하고 있습니까?

답변

3

제 질문은 tempList2 arraylist 객체를 올바르게 재활용하고 있습니까?

나는 "재활용"이란 의미를 모릅니다. 이것은 응용 프로그램이 새로운 객체를 할당하는 것을 피하기 위해 객체를 재활용하는 경우처럼 보이지 않습니다. (Java에서의 "재활용"의 일반적인 의미입니다.) tempList2 객체를 사용하여 여러 번 호출 한 경우 이는 단일 목록에 항목을 집계하는 단순한 방법입니다. getXYZArrayList을 반환하면 메서드 구현이 다른 ArrayList 인스턴스를 반환하도록 변경 될 수있는 가능성이 있습니다. 이는 그 자체로는이지만 문제는 아니지만 발신자가 통화 결과를 적절하게 할당하지 않은 것일 수 있습니다.

이 지정된 tempList2 개체에 한 번만 호출되는 경우이 메시지는 약간 이상해 보입니다.

요약하면이 코드는 다소 어지러워 보이며 사람이 getXYZ 구현을 변경하면 깨지기 쉽습니다. 그러나, 그것은 잘못 잘못된 것이 아니며, 질문에 포함 된 작은 코드 덩어리에서 분명하지 않은 이런 식으로 일하는 데는 좋은 이유 (또는 역사적인 이유)가있을 수 있습니다.

편집 -이 댓글에 응답은

사실, 위의 코드에 대한 이유는, 내가 두 ArrayList에 객체를 생성하지 않도록하고 싶어 (이 읽을 수 있도록 인라인).예를 들어 : 종래의 방법은

ArrayList tempList2 = new ArrayList(); 
tempList2 = getXYZ(tempList1); 

//method getXYZ 
getXYZ(ArrayList tempList1) { 
    ArrayList tempList = new ArrayList(); 
    //INSTANTIATED ONLY ONCE 
    //does some logic and adds objects into tempList 
    return tempList; 
} 

이 일의 실제 기존의 방법이 될 것 같습니다

ArrayList tempList2 = getXYZ(tempList1); 

또는

ArrayList tempList2; 
// some intermediate lines 
tempList2 = getXYZ(tempList1); 

이들 중 어느

불필요한 012 생성을 요구한다.인스턴스를 사용하고 두 ArrayList 인스턴스를 getXYZ 메서드로 전달하지 않아도됩니다.

+0

사실, 위 코드의 이유는 두 개의 arraylist 객체를 만드는 것을 피하기 위해서였습니다. 예 : 기존 방법은 입니다. ArrayList tempList2 = new ArrayList(); tempList2 = getXYZ (tempList1); // 메소드 getXYZ getXYZ (ArrayList tempList1) { ArrayList tempList = new ArrayList (//; // 배열 만 변경됨 // 일부 논리를 수행하고 tempList에 객체를 추가합니다. return tempList; } – user366930

0

tempList2 참조의 값을 전달 중입니다. 개체 자체는 복사되지 않습니다. 따라서 전달 된 tempList2이 수정되면 발신자에게 변경 사항이 표시됩니다. 이것도라고도합니다 call-by-sharing

무슨 일이 일어나는지 이해하면 아무 문제가 없습니다.

+1

이런 종류의 동작은 일반적으로 자바 코드에서 눈살을 찌푸 릴 정도로 추가하고 싶습니다. 이것은 기본적으로 부작용에 의존합니다. 그게 틀린 것은 아니지만 나는 아직도 이와 같은 일을하지 않을 것입니다. – Esko

+0

다릅니다. 공개 API에서는이를 피할 수 있지만 내부적으로는 편리 할 수 ​​있습니다. –

3

여기에는 "개체 재활용"이라는 개념이 없습니다. getXYZ()

tempList2 = new ArrayList(); 

: 그건 당신이이 같은 더 라인이없는 이상,하지 않을 경우에 ... 관심이 무엇인지 아무것도 쓰레기는 수집되지되고 있습니다.

ArrayList에 대한 참조가 메서드에 전달 된 다음 반환됩니다. 그게 다야. 단지 참조 일뿐입니다. 객체 자체가 아닙니다.

이제 전달 된 ArrayList 참조를 반환하는 방법이 다소 이상하다고 말할 수 있습니다. 일반적으로 유창한 인터페이스에 사용되지만 여기서는 그럴 듯하지 않습니다.