2010-02-21 6 views
4

나는 실제 코드에서 사용하는 clone() 메서드를 본 적이 없습니다. 나는 그것에 대해 읽고 있었고 그 사용이 코드를 매우 복잡하게 만들 수 있다고 느꼈다. clone() 메소드의 특정 사용 사례가 있습니까? 어떤 상황에서 clone()을 사용해야하며 왜 정상적인 conctructor를 사용하면 충분하지 않을까요?clone()에 대한 사용 사례

답변

2

Effective Java의 Josh Bloch도 clone() 메소드를 사용하지 않는 것이 좋습니다.

이 방법 몇 가지 문제가 있습니다

1) 복제 가능한 개체가 아니라 원시 형 필드가 아니라 필드를 반대 경우 복제 된 객체는 그 객체에 대한 참조가 아닌 진짜 복제 된 개체를 받게됩니다. 이것을 피하려면 모든 내부 객체도 복제 가능해야합니다.

2) cloneable 클래스의 하위 클래스를 만들면 (물론 원하지 않는 경우에도) 복제 가능합니다. 따라서 가능한 문제를 피하려면 clone() 메서드를 적절한 방법으로 재정의해야합니다.

언제 사용해야합니까? 가능하면 불가능합니다. 아주 조심해서 사용해야합니다. 복제 가능한 객체의 모든 필드가 원시 유형이면 위험하지 않습니다. 다른 모든 경우에는 그것을 사용하기 전에 두 번 생각하십시오.

+0

음 ... 나는 현재 읽고있는 책입니다. 방법에 관한 모든 것이 더러워 보입니다 ... 왜 그런지 궁금합니다. 존재하는 모든 – Aadith

+2

자바의 첫 번째 버전은 다소 빠른 릴리스되었습니다. 그들은 큰 일을했고 수많은 결정이 매우 영리했습니다. 그러나 그들은 또한 java.util.Date 클래스 또는 clone() 메소드와 같은 몇 가지 실수를 저질 렀습니다. API에 한 번 추가 된 경우에는 변경할 수 없습니다. – Roman

+0

@Roman java.util.Date는 어떨까요? 왜 실수 였지? – Aadith

3

clone 메소드 또는 생성자에 전달 된 배열의 방어 복사본을 만들 수있는 매우 편리합니다 (모든 배열 유형 Cloneable를, 그리고 같은 boolean[].clone() 것을 실제로 boolean[]보다는 Object 반환 있도록 clone()에 대한 서명은 공변됩니다). 그것은 내가 10 년 만에 보았던 유일한 좋은 사용법입니다 ...