
“สวัสดี อามีโก้!”
"สวัสดีคิม"
"ฉันจะบอกคุณเกี่ยวกับวิธีการโคลน ()"
"จุดประสงค์ของวิธีนี้คือการโคลนวัตถุหรืออีกนัยหนึ่งคือสร้างการโคลน/คัดลอก/ทำซ้ำของวัตถุ"
"เมื่อเมธอดนี้ถูกเรียกใช้ Java virtual machine จะสร้างและส่งคืนอ็อบเจกต์ที่ซ้ำกันที่ถูกเรียกใช้
การใช้เมธอดโคลนของคลาสอ็อบเจกต์นั้นเป็นเรื่องดั้งเดิมมาก: จะมีการสร้างออบเจกต์ใหม่เพียงอ็อบเจ็กต์เดียว และค่าของฟิลด์ของอ็อบเจ็กต์ดั้งเดิมจะถูกกำหนดค่าให้กับฟิลด์ของมัน
หากวัตถุที่คัดลอกมีการอ้างอิงไปยังวัตถุอื่น การอ้างอิงเหล่านั้นจะถูกคัดลอก วัตถุที่ซ้ำกันจะไม่ถูกสร้างขึ้น"
"หืม ไม่มีอะไรต้องพูดมากแล้ว"
"ประเด็นคือ Java virtual machine ไม่รู้ว่าอ็อบเจกต์ใดสามารถหรือไม่สามารถโคลนได้ ตัวอย่างเช่น ไม่สามารถโคลนไฟล์ได้ เช่นเดียวกับ System.in stream"
"ดังนั้น คำถามของการโคลนนิ่งเต็มรูปแบบจึงถูกส่งไปยังนักพัฒนาของชั้นเรียน" ทั้งหมดนี้คล้ายกับวิธีการจัดการกับวิธีการเท่ากับ มีแม้กระทั่งสิ่งที่เทียบได้กับ hashCode: อินเทอร์เฟซที่ลอกแบบได้"
" อินเทอร์เฟซ Cloneableคือสิ่งที่เรียกว่า 'อินเทอร์เฟซตัวทำเครื่องหมาย': ไม่มีวิธีการใด ๆ และใช้เพื่อทำเครื่องหมายคลาสบางคลาส
"หากผู้พัฒนาคลาสเชื่อว่าอ็อบเจกต์ของคลาสสามารถโคลนได้ เขาทำเครื่องหมายด้วยอินเทอร์เฟซนี้ (เช่น ทำให้คลาสใช้การโคลนได้)"
"หากนักพัฒนาไม่ชอบการใช้งานมาตรฐานของวิธีการโคลน เขาต้องเขียนด้วยตัวเขาเองซึ่งจะสร้างวัตถุที่ซ้ำกันด้วยวิธีที่ถูกต้อง"
"เมื่อคุณเรียกใช้ เมธอด clone () Java จะตรวจสอบว่าออบเจกต์รองรับอินเทอร์เฟซ Cloneable หรือไม่ หากใช่ จะโคลนออบเจ็กต์โดยใช้เมธอดclone () ถ้าไม่ จะโยน CloneNotSupportedException"
"อีกนัยหนึ่ง เราต้องแทนที่เมธอดการโคลนหรือทำให้คลาสใช้การโคลนได้"
"ใช่ แต่คุณยังต้องแทนที่เมธอด เมธอด clone() ถูกประกาศว่ามีการป้องกัน ดังนั้นจึงสามารถเรียกใช้โดยคลาสในแพ็คเกจของมัน (java.lang.*) หรือคลาสย่อยเท่านั้น"
"ฉันสับสนเล็กน้อย—ฉันต้องทำอย่างไรจึงจะโคลนวัตถุได้"
"หากคุณต้องการใช้วิธีการโคลน «default» ของคลาสอ็อบเจ็กต์ คุณต้อง:
" a)เพิ่มส่วนต่อประสานที่โคลนได้ให้กับชั้นเรียนของคุณ"
" b)ลบล้างวิธีการโคลนและเรียกการใช้งานของ superclass ภายในการใช้งานของคุณ:"
class Point implements Cloneable
{
int x;
int y;
public Object clone()
{
return super.clone();
}
}
"หรือคุณสามารถเขียนการใช้วิธีโคลนทั้งหมดด้วยตัวคุณเอง:"
class Point
{
int x;
int y;
public Object clone()
{
Point point = new Point();
point.x = this.x;
point.y = this.y;
return point;
}
}
“นั่นเป็นวิธีที่น่าสนใจ ฉันแน่ใจว่าฉันจะใช้มัน บางครั้ง…”
GO TO FULL VERSION