"왜 Cloneable
더 이상 사용되지 않습니까?"에 대한 짧은 대답 (또는 실제로 X
더 이상 사용 되지 않는 이유는) 더 이상 사용되지 X
않도록주의를 기울이지 않았다는 것입니다.
더 이상 사용되지 않는 대부분의 항목은 제거 할 특정 계획이 있으므로 더 이상 사용되지 않습니다. 예를 들어, Java SE 9에서는 LogManager의 메소드 addPropertyChangeListener
와 removePropertyChangeListener
메소드가 Java SE 8 에서 제거 되기 위해 더 이상 사용되지 않습니다. 그 이유는 모듈 상호 종속성이 불필요하게 복잡하기 때문입니다. 실제로 이러한 API는 JDK 9 초기 개발 에서 이미 제거 되었습니다. 빌드합니다. (유사한 속성 변경 리스너 호출도 제거되었습니다 ( JDK-8029806 참조 ).Pack200
그런 유사한 계획에 대한에 존재하지 않는 Cloneable
및 Object.clone()
.
더 긴 답변에는 이러한 API에 발생할 것으로 예상되는 사항, 더 이상 사용되지 않는 플랫폼에 어떤 비용 또는 이점이 발생하는지, API가 더 이상 사용되지 않을 때 개발자에게 전달되는 내용과 같은 추가 질문에 대해 논의해야합니다. 최근 JavaOne 토론 Debt and Deprecation 에서이 주제를 살펴 보았습니다 . (이 링크에서 제공되는 슬라이드; 여기 비디오 ) JDK 자체는 사용 중단에있어 일관성이없는 것으로 나타났습니다. 예를 들어 다음과 같은 여러 가지 다른 의미로 사용되었습니다.
이것은 위험하며 당신은 그것을 사용의 위험을 알고 있어야합니다 (예를 Thread.stop()
, Thread.resume()
및 Thread.suspend()
).
향후 릴리스에서 제거 될 예정입니다.
이것은 더 이상 사용되지 않으며 다른 것을 사용하는 것이 좋습니다 (예 :의 많은 메소드 java.util.Date
)
이 모든 것들은 별개의 의미이며, 다른 부분 집합은 더 이상 사용되지 않는 다른 것에 적용됩니다. 그리고 그들 중 일부는 더 이상 사용되지 않는 것들에 적용됩니다 (그러나 더 이상 사용되지 않아야 할 수도 있습니다).
Cloneable
그리고 Object.clone()
그들이 설계 결함을 가지고 올바르게 사용하기 불편하다는 의미에서 "깨진"입니다. 그러나 clone()
여전히 배열을 복사하는 가장 좋은 방법이며 복제에는 신중하게 구현 된 클래스 인스턴스의 복사본을 만드는 데 약간의 유용성이 있습니다. 복제를 제거하면 호환되지 않는 변경으로 인해 많은 문제가 발생합니다. 복제 작업은 다른 방식으로 다시 구현 될 수 있지만 아마도 속도가 느릴 수 있습니다 Object.clone()
.
그러나 대부분의 경우 복제본보다 사본 생성자가 선호됩니다. 따라서 Cloneable
"사용되지 않음"또는 "대체 됨"또는 이와 유사한 것으로 표시하는 것이 적절합니다. 이것은 개발자들에게 아마도 다른 곳을보고 싶다고 말하지만, 이후 릴리스에서 복제 메커니즘이 제거 될 것이라는 신호는 아닙니다. 불행히도, 그러한 마커는 존재하지 않습니다.
상황이 잘 드러나면서, "더 이상 사용되지 않음"은 사용되지 않는 기능이 거의 사라 졌음에도 불구하고 궁극적 인 제거를 의미하는 것으로 보이므로 사용 중단이 복제 메커니즘에 대해 보증되지 않는 것 같습니다. 아마도 미래에는 개발자가 대체 메커니즘을 대신 사용하도록하는 대체 표시를 적용 할 수 있습니다.
최신 정보
버그 보고서 에 몇 가지 추가 기록을 추가했습니다 . 초기 JVM 구현 자이자 JVM 스펙의 공동 저자 인 Frank Yellin은 다른 답변 에서 인용 된 TRC 권장 사항의 "미시간에 잃어버린"주석에 대한 응답으로 일부 주석을 작성했습니다 . 여기에 관련 부분을 인용했습니다. 전체 메시지는 버그 보고서에 있습니다.
Cloneable에는 Serializable과 달리 동일한 방법이 없습니다. Cloneable은 클래스가 지원하는 메서드에 대해 구체적으로 말하지 않고 클래스의 속성을 나타냅니다.
반영하기 전에, 우리는 객체의 얕은 사본을 만들기위한 기본 방법이 필요했습니다. 따라서 Object.clone ()이 탄생했습니다. 또한 많은 클래스가이 메소드를 재정의하고 모든 클래스를 복제하려는 것은 아니라는 것이 분명했습니다. 따라서 Cloneable은 프로그래머의 의도를 나타 내기 위해 탄생했습니다.
요컨대 Cloneable의 목적은 공용 clone () 메소드가 있음을 나타 내기위한 것이 아닙니다. Object.clone ()을 사용하여 복제 할 의사가 있음을 나타 내기 위해 clone ()을 공개할지 여부를 결정하는 것은 구현에 달려 있습니다.