คำตอบสั้น ๆ เกี่ยวกับ "ทำไมจึงไม่Cloneable
คัดค้าน" (หรือจริง ๆ แล้วทำไมถึงไม่X
คัดค้านสำหรับใครX
) ก็คือไม่ได้ให้ความสนใจมากนักในการคัดค้านพวกเขา
สิ่งส่วนใหญ่ที่ไม่ได้รับการสนับสนุนเมื่อเร็ว ๆ นี้ถูกคัดค้านเนื่องจากมีแผนเฉพาะที่จะลบออก ตัวอย่างเช่น, addPropertyChangeListener
และremovePropertyChangeListener
วิธีการของLogManagerถูกเลิกใช้ใน Java SE 8โดยมีความตั้งใจที่จะลบมันใน Java SE 9 (เหตุผลก็คือพวกเขามีความซับซ้อนโดยไม่จำเป็นซึ่งกันและกันโมดูล) API เหล่านี้ได้ถูกลบออกจากการพัฒนาJDK 9 ก่อนสร้าง (โปรดทราบว่าการเรียกฟังการเปลี่ยนแปลงคุณสมบัติที่คล้ายกันก็ถูกลบออกจากPack200
ด้วย; ดูJDK-8029806 )
ไม่มีแผนดังกล่าวที่คล้ายกันที่มีอยู่เพื่อสำหรับและCloneable
Object.clone()
คำตอบที่ยาวขึ้นจะเกี่ยวข้องกับการพูดคุยคำถามเพิ่มเติมเช่นสิ่งที่คาดว่าจะเกิดขึ้นกับ API เหล่านี้ต้นทุนหรือผลประโยชน์ใดที่จะเกิดขึ้นกับแพลตฟอร์มหากเลิกใช้แล้วและสิ่งใดบ้างที่สื่อสารกับนักพัฒนาเมื่อ API เลิกใช้ ผมสำรวจหัวข้อนี้ในการพูดคุย JavaOne ล่าสุดของฉัน, ตราสารหนี้และการเลิกใช้ (สไลด์มีให้ที่ลิงก์นั้นวิดีโอที่นี่ ) ปรากฎว่า JDK นั้นไม่ได้สอดคล้องกันอย่างมากในการใช้งานการคัดค้าน มันถูกใช้เพื่อหมายถึงสิ่งต่าง ๆ รวมถึงตัวอย่าง
นี้เป็นอันตรายและคุณควรจะตระหนักถึงความเสี่ยงของการใช้มัน (ตัวอย่าง: Thread.stop()
, Thread.resume()
และThread.suspend()
)
สิ่งนี้กำลังจะถูกลบในการเปิดตัวในอนาคต
สิ่งนี้ล้าสมัยและเป็นความคิดที่ดีที่คุณจะใช้สิ่งที่แตกต่าง (ตัวอย่าง: วิธีการหลายวิธีในjava.util.Date
)
ทั้งหมดเหล่านี้มีความหมายที่แตกต่างกันและส่วนย่อยต่าง ๆ ของพวกเขานำไปใช้กับสิ่งต่าง ๆ ที่เลิกใช้แล้ว และบางส่วนของพวกเขานำไปใช้กับสิ่งที่ไม่ได้เลิกใช้ (แต่อาจจะเลิกใช้แล้ว)
Cloneable
และObject.clone()
"แตก" ในแง่ที่ว่าพวกเขามีข้อบกพร่องในการออกแบบและใช้งานได้ยาก อย่างไรก็ตามclone()
ยังคงเป็นวิธีที่ดีที่สุดในการคัดลอกอาร์เรย์และการโคลนมีประโยชน์ จำกัด ในการทำสำเนาอินสแตนซ์ของคลาสที่มีการใช้งานอย่างระมัดระวัง การลบการโคลนจะเป็นการเปลี่ยนแปลงที่เข้ากันไม่ได้ซึ่งจะทำลายหลายสิ่ง การดำเนินการโคลนอาจจะ reimplemented วิธีที่แตกต่างกัน Object.clone()
แต่ก็อาจจะช้ากว่า
อย่างไรก็ตามสำหรับสิ่งส่วนใหญ่ตัวสร้างการคัดลอกจะดีกว่าการโคลน ดังนั้นอาจทำเครื่องหมายCloneable
ว่า "ล้าสมัย" หรือ "แทนที่" หรือสิ่งที่คล้ายกันจะเหมาะสม สิ่งนี้จะบอกนักพัฒนาว่าพวกเขาอาจต้องการมองหาที่อื่น แต่ก็ไม่ได้ส่งสัญญาณว่ากลไกการโคลนอาจถูกลบออกในการเปิดตัวในอนาคต น่าเสียดายที่ไม่มีเครื่องหมายดังกล่าวอยู่
ขณะที่สิ่งต่าง ๆ ยืนอยู่ "การคัดค้าน" ดูเหมือนจะบ่งบอกถึงการเอาออกในที่สุด - แม้ว่าจะมีการลบคุณลักษณะที่คัดค้านจำนวนเล็กน้อยที่หายไปอย่างไม่เคยมีมาก่อน บางทีในอนาคตอาจมีการใช้การทำเครื่องหมายทางเลือกซึ่งนำผู้พัฒนาไปใช้กลไกทางเลือกแทน
UPDATE
ฉันได้เพิ่มประวัติเพิ่มเติมบางอย่างเพื่อรายงานข้อผิดพลาด แฟรงก์สะใจเป็น implementor JVM และผู้เขียนร่วมของสเป JVM ต้นได้แสดงความคิดเห็นบางอย่างในการตอบสนองต่อความคิดเห็น "หายไปในหมอกของเวลา" ในคำแนะนำของ TRC ยกมาในคำตอบอื่น ๆ ฉันอ้างส่วนที่เกี่ยวข้องที่นี่; ข้อความเต็มอยู่ในรายงานข้อผิดพลาด
Cloneable ไม่มีวิธีการด้วยเหตุผลเดียวกับที่ Serializable ไม่มี Cloneable เป็นการระบุคุณสมบัติของคลาสแทนที่จะพูดถึงสิ่งใดโดยเฉพาะเกี่ยวกับวิธีการที่คลาสนั้นสนับสนุน
ก่อนการไตร่ตรองเราจำเป็นต้องใช้วิธีการดั้งเดิมในการทำสำเนาวัตถุแบบตื้น ดังนั้น Object.clone () จึงเกิด เป็นที่ชัดเจนว่าหลาย ๆ คลาสต้องการที่จะแทนที่เมธอดนี้และไม่ใช่ว่าทุกคลาสจะต้องการถูกโคลน ดังนั้น Cloneable จึงถือกำเนิดขึ้นเพื่อบ่งบอกถึงความตั้งใจของโปรแกรมเมอร์
ดังนั้นในระยะสั้น วัตถุประสงค์ของการ Cloneable ไม่ได้เป็นการระบุว่าคุณมีวิธีการโคลนสาธารณะ () มันเป็นการบ่งบอกว่าคุณเต็มใจที่จะโคลนโดยใช้ Object.clone () และมันก็ขึ้นอยู่กับการใช้งานเพื่อตัดสินใจว่าจะทำการโคลนนิ่งสาธารณะหรือไม่