Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความสำคัญของวิธีการโคลน () ใน Java?


โคลน() เมธอดใช้ในการสร้างสำเนาของวัตถุของคลาสซึ่งใช้งาน Cloneable อินเตอร์เฟซ. โดยค่าเริ่มต้น จะ การคัดลอกแบบฟิลด์ต่อฟิลด์ เนื่องจากคลาส Object ไม่มีแนวคิดเกี่ยวกับสมาชิกของคลาสเฉพาะที่อ็อบเจ็กต์เรียกวิธีนี้ ดังนั้น หากคลาสมีเฉพาะสมาชิกประเภทข้อมูลพื้นฐาน สำเนาใหม่ของอ็อบเจ็กต์จะถูกสร้างขึ้นและการอ้างอิงถึงสำเนาอ็อบเจ็กต์ใหม่จะถูกส่งคืน แต่ถ้าคลาสมีสมาชิกของประเภทคลาสใดๆ เฉพาะอ็อบเจ็กต์ที่อ้างอิงถึงสมาชิกเหล่านั้นเท่านั้นที่จะถูกคัดลอก และด้วยเหตุนี้ สมาชิกจึงอ้างอิงทั้งในออบเจกต์ดั้งเดิมและอ็อบเจ็กต์ที่ลอกแบบมาจากอ็อบเจกต์เดียวกัน

เราจะได้ CloneNotSupportedException ถ้าเราพยายามเรียก โคลน() เมธอดบนวัตถุของคลาสที่ไม่ได้ใช้ Cloneable อินเตอร์เฟซ. อินเทอร์เฟซนี้เป็นอินเทอร์เฟซสำหรับเครื่องหมาย และการใช้งานอินเทอร์เฟซนี้บ่งชี้ว่า Object.clone() เมธอดสามารถเรียกใช้บนอ็อบเจ็กต์ของคลาสที่นำไปใช้ได้

ไวยากรณ์

protected Object clone() throws CloneNotSupportedException

เราสามารถใช้วิธี clone() ได้สองวิธี

สำเนาตื้น

นี่เป็นผลลัพธ์ของฟังก์ชันการโคลนเริ่มต้นโดย Object.clone() เมธอด ถ้าคลาสมีสมาชิกประเภทข้อมูลที่ไม่ใช่แบบพื้นฐานด้วย ในกรณีของ Shallow Copy วัตถุที่ลอกแบบมายังหมายถึงวัตถุเดียวกันกับที่วัตถุดั้งเดิมอ้างถึง เนื่องจากจะมีการคัดลอกเฉพาะการอ้างอิงวัตถุเท่านั้น ไม่ใช่วัตถุที่อ้างอิง

ตัวอย่าง

public class ShallowCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append("Tutorialspoint!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
      public String toString() {
         return sb.toString();
      }
   public Object clone() {
      try {
         return super.clone();
      } catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

ผลลัพธ์

Welcome to Tutorialspoint!
Welcome to Tutorialspoint!


Deep Copy

เราจำเป็นต้องแทนที่ โคลน() เมธอดสำหรับคลาสที่มีสมาชิกประเภท non-primitive เพื่อให้ได้ Deep Copy เนื่องจากต้องการให้ออบเจ็กต์สมาชิกถูกโคลนด้วย ซึ่งไม่ได้ทำโดยกลไกการโคลนเริ่มต้น

ตัวอย่าง

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" TutorialsPoint!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
   public String toString() {
      return sb.toString();
   }
   public Object clone() {
      try {
         A a = (A) super.clone();
         a.sb = new StringBuffer(sb.toString());
         return a;
      }
      catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

ผลลัพธ์

Welcome to TutorialsPoint!
Welcome to