2009-08-12 8 views

답변

21

짧은 대답 : 얕은.

이렇게 짧은되지 않음 대답 : 그것은 오버라이드 (override) 않는 한 는 AnyRef.clone는() 구현으로 자바의 Object.clone()에()를 사용합니다. 따라서 Object.clone()에

자바 독 클래스 Object 위한

있어서 클론 특정 복제 작업을 수행한다. 첫 번째,이 객체의 클래스 이 인터페이스 Cloneable을 구현하지 않으면 CloneNotSupportedException이 발생합니다. 모든 배열은 으로 간주되어 Cloneable 인터페이스를 구현합니다. 그렇지 않은 경우이 메서드는이 객체의 클래스 의 새 인스턴스 을 만들고이 필드의 해당 필드의 내용 인 과 정확히 일치하는 모든 필드를 초기화합니다. 의 내용은 필드 자체가 복제되지 않습니다. 따라서이 메서드는 "deep 복사"작업이 아니라이 개체의 "shallow 복사본"을 수행합니다.

참고 :

  1. AnyRef.clone을(), 자바에서의 대응처럼, 그 호출하지 그래서 모든 곳에서하는 "보호"액세스 수준을 가지고있다.
  2. clone()이 작동하려면 Cloneable을 구현해야합니다.

긴 대답 : 그것을 사용하지 마십시오 신중하게

요약가 재정의 클론 : 효과적인 자바, 제 2 판, 항목 11을 참조하십시오. 더 나은 대안이 있습니다.

+3

"더 나은 대안이 있습니다." 당신이 좀 참조할까요? –

+6

1. C++에 따라 생성자를 복사하십시오. 2. Scala 2.8.x에 내장 된 "copy"메소드가있는 케이스 클래스. 3. 변경할 수없는 개체를 사용하십시오. 복사하거나 공유하지 않아도됩니다. –

+0

그래서 스칼라에서는 C++과 같은 복사본 생성자가 실제로 (일종의) 괜찮습니까? C++에서 언어로 왔고 첫 번째 복사본 생성자를 수행하기 전에 몇 가지 사항을 놓치고 있는지 확인하고 싶었습니다. 보입니다 ... 괜찮습니다 (제 물건의 상태가 변할 수 있습니다). – akauppi

관련 문제