วิธีการโคลนและอินเทอร์เฟซที่โคลนได้ - 1

“สวัสดี อามีโก้!”

"สวัสดีคิม"

"ฉันจะบอกคุณเกี่ยวกับวิธีการโคลน ()"

"จุดประสงค์ของวิธีนี้คือการโคลนวัตถุหรืออีกนัยหนึ่งคือสร้างการโคลน/คัดลอก/ทำซ้ำของวัตถุ"

"เมื่อเมธอดนี้ถูกเรียกใช้ 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;
 }
}

“นั่นเป็นวิธีที่น่าสนใจ ฉันแน่ใจว่าฉันจะใช้มัน บางครั้ง…”