2010-06-30 6 views
1

나는 주위를 둘러 보았고 몇 가지 팁을 보았지만 여전히 내 문제의 해결책을 찾지 못했습니다. 기존 자바 객체에 대한 참조를 작성하는 대신 기존 Java 객체를 복사해야합니다. 클래스에 액세스 할 수 없으며 부모 클래스를 통해 복제 메서드를 구현합니다.이 메서드는 실제로 참조를 만듭니다. "serialization/deserialization"라우트로 이동하려고 시도했지만 어느 정도는 작동했지만 복사본은 원래의 것과 정확히 동일하지 않습니다. 이 작업을 수행 할 수 있습니까? 미리 감사드립니다. 데이비드Java로 개체를 복사하는 방법은 무엇입니까?

+0

"FAITHFUL"을 정의하십시오. 이것은 예술 용어는 아닙니다. –

+0

딥 클로 링 (deep cloing) 라이브러리를 확인하셨습니까? http://robust-it.co.uk/clone/ –

+0

이것은 일반적으로 나쁜 생각입니다. 내 말은, 너는 얕은 사본이나 깊숙한 사본을 원하니? 얼마나 깊은가요? 전체 프로그램을 복사해야합니까? 그 파일의 복사본이 없다면 복사해서는 안되는 것을 참조하지 않는다는 것을 어떻게 알 수 있습니까? 실제로 사용할 수있는 다른 디자인이 있습니까? –

답변

2

을하려고하면 안되며, 당신은 할 수 없습니다.

왜 안 :

esp는 cloned- 안 객체가 있습니다. 소프트웨어 컨트롤 외부의 리소스를 참조하는 사용자는 복제를 통해 혼란을 야기 할 수 있습니다.

왜 당신은 할 수 없습니다

: 객체가 참조하는 모든 개체가 복제되는 경우

직렬화 및 역 직렬화에만 작동합니다 직렬화합니다. 당신은 새로운 객체와 인스턴스화하여 깊은 클론을 만들 반사를 사용하는 몇 가지 코드를 작성할 수

깊은 복제 재귀 적으로 모든 필드, 그러나 깊은이 객체 복제 할 수있는 방법을 구현하는 시도 :

public class Evil { 
    public Evil() { 
     throw new RuntimeException(); 
    } 
} 

문제의 핵심은 내가 실수하지 않는다면 리플렉션을 통한 복제는 항상 Reflection을 통해 생성자를 호출하는 것에 달려 있으며 생성자는 작동하도록 보장되지 않는다는 것입니다.

그러나 대부분의 경우이 방법은 대부분의 개체를 복제합니다. 그러나 당신은 여전히 ​​그것을해서는 안됩니다! 이 작업에 대한 올바른 시나리오를 생각할 수 없습니다.

편집 : 또한 일부 주석가들은 "충실한 사본"이 매우 불명확하다고 지적했기 때문에.

편집 2 : 결론 : 클래스 만 복제 가능해야하는지와 어떻게해야 하는지를 알 수 있습니다.

1

는 일반적인 경우에 Java deep cloning library

Cloner cloner = new Cloner(); 
cloner.deepClone(object); 
+0

그것은 그것의 요구에 부응한다면 이것은 흥미로운 것으로 보인다. 이 라이브러리를 살펴 보겠습니다. 감사합니다! –

관련 문제