복제 가능이 권장되지 않는 이유는 무엇입니까?
로 있다Cloneable
자바 인터페이스가 파손되었습니다.거기에는 많은 이유가 있지만, 나는 언급하지 않을 것이다; 다른 사람들은 이미 그것을 했다.이는 Java 설계자 자신의 입장이기도 합니다.
그래서 내 질문은: 왜 아직 추천되지 않았는가 하는 것이다.핵심 Java 팀이 고장났다고 판단한 경우 권장 해제도 고려했을 것입니다.이를 반대하는 이유(Java 8에서는 아직 권장되지 않음)는 무엇입니까?
1997년에 Java Bug Database에 제출된 버그가 있습니다.clone()
to 는 methodCloneable
그래서 더 이상 쓸모없게 되지 않을 것이다.고치지 '는, 은 다음과
Sun의 Technical Review Committee(TRC; 기술검토위원회)는 이 문제를 상세하게 검토했으며 현재 복제 가능한 인터페이스의 문서 개선 이외의 조치를 취하지 말 것을 권고했습니다.권장사항 전문은 다음과 같습니다.
기존 Java 객체 복제 API에 문제가 있습니다.java.lang에는 보호된 "복제" 메서드가 있습니다.오브젝트와 인터페이스 java.lang이 있습니다.복제 가능.그 목적은 클래스가 다른 사용자가 클론을 만들 수 있도록 하는 경우 클론 가능 인터페이스를 지원하고 기본 보호된 클론 메서드를 퍼블릭클론 메서드로 덮어쓰는 것입니다.안타깝게도 시간이 흐르면서 쉽게 상실된 이유로 복제 가능 인터페이스는 복제 메서드를 정의하지 않습니다.
이 조합은 상당한 혼란을 초래합니다.일부 클래스는 복제 가능을 지원한다고 주장하지만 실수로 복제 방법을 지원하지 않습니다.개발자들은 클론블의 작동 방식과 클론의 기능에 대해 혼란스러워하고 있습니다.
안타깝게도 복제 가능에 "복제" 메서드를 추가하면 호환되지 않는 변경 사항이 발생합니다.바이너리 호환성은 깨지지 않지만 소스 호환성은 깨집니다.실제로 클래스가 복제 가능 인터페이스를 지원하지만 공개 복제 방법을 제공하지 못하는 사례가 다수 있음을 시사하는 일화적 증거가 있습니다.논의 후 TRC는 호환성에 영향을 미치기 때문에 기존 복제 가능 인터페이스를 변경하지 말 것을 만장일치로 권고했습니다.
다른 제안으로는 새로운 인터페이스 java.lang을 추가하는 것이 있습니다.PublicCloneable은 복제 가능의 원래 목적을 반영합니다.TRC는 5대 2의 다수로 이에 반대할 것을 권고했습니다.주된 우려는 이것이 이미 혼란스러운 그림에 더 많은 혼란(철자 혼동을 포함!
TRC는 기존의 클론화 가능 인터페이스에 매뉴얼을 추가하여 그 사용방법과 구현자의 '베스트 프랙티스'를 기술할 것을 만장일치로 권장합니다.
따라서 이것이 직접적으로 권장되지 않는 것은 아니지만, 복제 가능한 것을 "비사용"으로 하지 않는 이유는 Technical Review Comite가 기존 문서를 수정하는 것으로 충분하다고 판단했기 때문입니다.그리고 그들은 그렇게 했다.Java 1.4까지는Cloneable
는 다음과되었습니다.
클래스는 Cloneable 인터페이스를 구현하여 Object.clone() 메서드에 해당 클래스의 인스턴스의 필드 간 복사가 합법임을 나타냅니다.
복제 가능 인터페이스를 구현하지 않은 인스턴스를 복제하려고 하면 Clone Not Supported 예외가 발생합니다.예외가 느려지고 있습니다.
인터페이스 클론 가능은 메서드를 선언하지 않습니다.
Java 1.4(2002년 2월 출시)부터 최신 에디션(Java 8)까지 다음과 같습니다.
클래스는 Cloneable 인터페이스를 구현하여 Object.clone() 메서드에 해당 클래스의 인스턴스의 필드 간 복사가 합법임을 나타냅니다.복제 가능 인터페이스를 구현하지 않은 인스턴스에서 개체의 복제 메서드를 호출하면 Clone Not Supported 예외가 발생합니다.예외가 느려지고 있습니다.
일반적으로 이 인터페이스를 구현하는 클래스는 퍼블릭 메서드로 Object.clone(보호됨)을 재정의해야 합니다.이 메서드를 재정의하는 방법에 대한 자세한 내용은 Object.clone()을 참조하십시오.
이 인터페이스에는 클론 방식이 포함되어 있지 않습니다.따라서 단순히 이 인터페이스가 구현되어 있다는 사실만으로 개체를 복제할 수 없습니다.클론 방식이 반사적으로 실행된다고 해도 성공한다는 보장은 없다.
안 돼의 입니다.Cloneable
( 안 거야?)X
되지 않음, 의 ""에 X
는 그들을하는 것에 이 별로 것을 .)
최근 폐지된 대부분의 것들은 구체적인 제거 계획이 있기 때문에 폐지되었다.를 들면, 「」는,addPropertyChangeListener
★★★★★★★★★★★★★★★★★」removePropertyChangeListener
LogManager 메서드는 Java SE 9에서 삭제할 목적으로 Java SE 8에서 권장되지 않습니다(이러한 메서드는 모듈 상호의존성을 불필요하게 복잡하게 하기 때문입니다).실제로 이들 API는 초기 JDK 9 개발 빌드에서는 이미 삭제되어 있습니다.(동일한 속성 변경 리스너 콜도 에서 삭제되어 있는 것에 주의해 주십시오.Pack200
; 「JDK-8029806」을 참조해 주세요).
.Cloneable
★★★★★★★★★★★★★★★★★」Object.clone()
.
더 긴 답변은 이러한 API에 대해 예상되는 것, 이러한 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 권장 사항의 "시간의 안개 속에서 잃어버린" 코멘트에 대해 몇 가지 코멘트를 했습니다.여기 관련 부분을 인용했습니다.전체 메시지는 버그 리포트에 있습니다.
복제 가능에는 Serializable과 동일한 이유가 없습니다.복제 가능은 클래스가 지원하는 메서드에 대해 구체적으로 언급하지 않고 클래스의 속성을 나타냅니다.
반영하기 전에 오브젝트의 얕은 복사본을 만들기 위한 네이티브 메서드가 필요했습니다.따라서 Object.clone()이 생성되었습니다.또한 많은 클래스가 이 메서드를 덮어쓰기를 원하며 모든 클래스가 복제되는 것은 아니라는 것도 분명했습니다.따라서 복제 가능은 프로그래머의 의도를 나타내기 위해 탄생했습니다.
한마디로 말해서.Cloneable의 목적은 퍼블릭클론() 메서드가 있음을 나타내는 것이 아닙니다.이는 Object.clone()을 사용하여 복제할 의사가 있음을 나타내는 것으로, clone() 공개 여부는 구현에 달려 있습니다.
왜 아직 폐지되지 않았을까?
왜냐하면 JCP는 그렇게 하는 것이 적절하지 않다고 생각했기 때문에, 그리고 앞으로도 그렇게 하지 않을지도 모른다.물어보세요.당신은 잘못된 곳에서 묻고 있어요.
Java API에서 이 기능을 유지하는 이유는 무엇입니까?
하위 호환성 요건 때문에 Java API에서 아무것도 삭제하지 않습니다.마지막으로 발생한 것은 1996/7년에 1.0과 1.1 사이의 AWT 이벤트 모델이 변경된 것입니다.
언급URL : https://stackoverflow.com/questions/26398951/why-is-cloneable-not-deprecated
'programing' 카테고리의 다른 글
효과적인 최종 vs 최종 - 다른 동작 (0) | 2023.02.06 |
---|---|
필요한 경우 소수점 이하 2자리까지 반올림하는 방법 (0) | 2023.02.06 |
Java 8: Java.util.function의 TriFunction(및 kin)은 어디에 있습니까?아니면 대체방법이 뭐죠? (0) | 2023.02.06 |
MySQL 쿼리에서 IF ELSE 문을 쓰는 방법 (0) | 2023.02.06 |
소수점 두 자리로 플로트를 표시하는 방법은 무엇입니까? (0) | 2023.02.06 |