2014-09-14 6 views
-1

질문을 입력하기 전에 기본 유형 이외의 모든 것을 알고 있으며 모든 것이 참조 번호로 저장됩니다. 내 Java 코드 구조는 다음과 같습니다. ..... 처음에는 드라이버, 예약 및 자동차 클래스가 있습니다. 그들 사이의 관계는 운전자가 예약을 수행 한 운전자이고, 자동차가 예약 클래스에 저장된 운전 예정자입니다.ArrayList (완전 딥 복사)

운전자가 예약을 처리합니다. 자동차에는 몇 가지 기본 유형 정보가 있습니다. 여러 대의 차량을 예약에 저장할 수 있습니다 (기본 및 ArrayList). 그러나 (드라이버 클래스의) 하나의 드라이버 (ArrayList)는 여러 예약을 가질 수 있습니다. 따라서 사용자가 그의 예약에있는 드라이버를 볼 수있게하면 ArrayList의 모든 내용을 기본 형식을 제외한 모든 것이 참조 번호이므로 모든 내용을 자세히 복사하려고합니다.

어쨌든, 나는 드라이버 클래스에서 예약을위한 배열 목록의 사본을 만들 것입니다.

내 드라이버 클래스에서 이것은 접근 자이며 ArrayList을 전달할 때 먼저 딥 복사를 시도하고 ArrayList을 전달하려고했습니다.

public ArrayList<Reference> getReference() {  

    copiedRef = new ArrayList<Reference>(); 

    //references have been declared above 
    for (int i = 0; i < references.size(); i++) { 
     copiedRef.add(references.get(i)); 
     //getting each element in the arrayList one by one and push to a new ArrayList 
    } 

    return copiedRef; 
} 

딥 복사본입니까? 그리고 clone()을 사용해야하는 경우.

어떻게 향상시킬 수 있습니까? (clone은 얕은 복사를 수행하는데, 나는 clone이 깊은 복사에 도움이 될 수 있다고 생각지 않거나 다른 게시물을 오해 할 수 있음).

+0

이것은 얕은 사본입니다. Reference 클래스에는 무엇이 포함되어 있습니까? –

답변

0

아니요. 코드 위

copiedRef.add(references.get(i)); 

각 유형의 참조의 객체,이 새로운 ArrayList를로 참조 (참조를 복사) 저장을 가져옵니다. 기본적으로 각 references.get (i) 객체와 동일한 상태로 새 인스턴스를 만들어야합니다.

참조 유형에 모두 프리미티브 유형이있는 경우 이러한 참조를 추가하는 동안 (Reference)references.get(i).clone()을 호출 할 수 있습니다.

2

코드는 참조 목록을 제외하고 전혀 복사하지 않습니다. 그것은

copiedRef = new ArrayList<>(references); 

clone 깊은 복사를 수행 한 줄에 해당하고, 그를 지원하기 위해 설계되었습니다. Object의 기본 구현 만 얕은 복사를 수행합니다.

그러나 의 계약 요구 사항 및 제한 사항으로 인해 final 필드와 관련된 성가 시게 사용하지 않는 것이 좋습니다. 대신 도메인 클래스의 복사 생성자를 제공 할 수 있습니다.

일반적으로 최소한의 코드를 사용하여 딥 복사를 수행하는 가장 간단한 방법은 메모리 내 직렬화 - 직렬화 순환을 이용하는 것입니다. 이 경우에는 "성능"이 더러운 단어임을 유의하십시오.