كيفية تنفيذ النسخة الضحلة والنسخ العميق في جافا



ستزودك هذه المقالة بمعرفة مفصلة وشاملة عن النسخة الضحلة والنسخة العميقة في جافا مع أمثلة.

الاستنساخ هو عملية إنشاء نسخة متماثلة أو نسخة من كائن ، طريقة استنساخ Java.lang.Object يستخدم لإنشاء نسخة أو نسخة طبق الأصل من كائن. كائنات جافا التي تنفذ واجهة Cloneable مؤهلة لاستخدام طريقة النسخ. في هذه المقالة ، سنناقش النسخة الضحلة والنسخة العميقة بالترتيب التالي:

إنشاء نسخة من عنصر جافا

يمكننا إنشاء نسخة طبق الأصل أو نسخة من كائن جافا بواسطة





1. إنشاء نسخة من الكائن في موقع ذاكرة مختلف. وهذا ما يسمى نسخة عميقة.

2. إنشاء مرجع جديد يشير إلى نفس موقع الذاكرة. وهذا ما يسمى أيضًا بالنسخة الضحلة.



التجاوز والحمل الزائد في جافا

نسخة سطحية

يؤدي التنفيذ الافتراضي لطريقة النسخ إلى إنشاء نسخة ضحلة من الكائن المصدر ، وهذا يعني إنشاء مثيل جديد من نوع الكائن ، ونسخ جميع الحقول إلى مثيل جديد وإرجاع كائن جديد من النوع 'كائن'. يحتاج هذا الكائن بشكل صريح إلى التلبيس في نوع الكائن للكائن المصدر.

سيكون لهذا الكائن نسخة طبق الأصل من جميع حقول الكائن المصدر بما في ذلك النوع الأولي ومراجع الكائن. إذا كان الكائن المصدر يحتوي على أي إشارات إلى كائنات أخرى في الحقل ، فسيكون في المثيل الجديد مراجع فقط لتلك الكائنات ، ولن يتم إنشاء نسخة من هذه الكائنات. هذا يعني أنه إذا قمنا بإجراء تغييرات في النسخة الضحلة ، فسوف تنعكس التغييرات في الكائن المصدر. كلتا الحالتين ليست مستقلة.

طريقة النسخ في فئة الكائن محمية بطبيعتها ، لذلك لا يمكن لجميع الفئات استخدام طريقة clone (). تحتاج إلى تنفيذ واجهة Cloneable وتجاوز طريقة النسخ. إذا لم يتم تنفيذ واجهة Cloneable ، فستحصل على CloneNotSupportedException.super.clone () سيعيد نسخة ضحلة حسب التطبيق في فئة الكائن.



كود النسخة الضحلة

package com.test class Department {String empId String grade String designation public Department (String empId، String grade، String designation) {this.empId = empId this.grade = grade this.designation = designation}} class الموظف ينفذ Cloneable {int id اسم السلسلة ، القسم العام ، الموظف (معرف int ، اسم السلسلة ، قسم القسم) {this.id = id this.name = name this.dept = dept} // الإصدار الافتراضي لطريقة clone (). يقوم بإنشاء نسخة ضحلة من كائن. يستنسخ الكائن المحمي () CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1'، 'A'، 'AVP') الموظف emp1 = موظف جديد (111، 'John'، dept1) الموظف emp2 = null حاول {// إنشاء نسخة من emp1 وتعيينه إلى emp2 emp2 = (الموظف) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // طباعة تسمية 'emp1' System.out.println (emp1.dept.designation) // الإخراج: AVP // تغيير تعيين 'emp2' emp2.dept.designation = 'Director' // سينعكس هذا التغيير في الموظف الأصلي 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

انتاج:

Output-Shallow-Copy

كيفية صنع إطار jframe

في المثال أعلاه ، لدينا فئة الموظف emp1 التي لها ثلاثة معرِّف متغير للفئة (int) ، والاسم (String) والقسم (Department).

لقد استنسخنا الآن emp1 إلى emp2 لإنشاء نسخة ضحلة ، وبعد ذلك قمنا بتغيير التعيين باستخدام كائن emp2 وتحققنا من انعكاس التغييرات نفسها في emp1 أيضًا.


نسخة عميقة

ستحتوي النسخة العميقة من الكائن على نسخة طبق الأصل من جميع حقول الكائن المصدر مثل نسخة ضحلة ، ولكن بخلاف النسخة الباهتة إذا كان الكائن المصدر يحتوي على أي مرجع لكائن كحقول ، يتم إنشاء نسخة طبق الأصل من الكائن عن طريق استدعاء استنساخ طريقة. هذا يعني أن كائنات المصدر والوجهة مستقلة عن بعضها البعض. لن يؤثر أي تغيير يتم إجراؤه على الكائن المستنسخ على الكائن المصدر.

كود للنسخ العميق

package com.test class Department ينفذ Cloneable {String empId String grade String designation public Department (String empId، String grade، String designation) {this.empId = empId this.grade = grade this.designation = designation} // الإصدار الافتراضي للنسخ () طريقة. يطرح استنساخ الكائن المحمي () فئة CloneNotSupportedException {return super.clone ()}} يقوم الموظف بتنفيذ Cloneable {int id String name Department dept public Employee (معرف int ، اسم السلسلة ، قسم القسم) {this.id = id this.name = name this.dept = dept} // Overriding clone () طريقة لإنشاء نسخة عميقة من كائن. المحمية كائن clone () يلقي CloneNotSupportedException {الموظف emp = (الموظف) super.clone () emp.dept = (Department) dept.clone () return emp}} فئة عامة DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ('1'، 'A'، 'AVP') الموظف emp1 = موظف جديد (111، 'John'، dept1) الموظف emp2 = null try {// إنشاء نسخة من emp1 وتعيينها إلى emp2 emp2 = (الموظف) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // طباعة تعيين 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / تغيير تسمية 'emp2' emp2.dept.designation = 'Director' // سينعكس هذا التغيير في الموظف الأصلي 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

انتاج:

في المثال أعلاه للنسخة العميقة ، على عكس النسخة الضحلة ، كل من كائنات المصدر والوجهة مستقلة عن بعضها البعض. لن يؤثر أي تغيير يتم إجراؤه في emp2 على emp1.

الفرق بين النسخة الضحلة والنسخة العميقة

نسخة سطحية نسخة عميقة
لا يتم فصل الكائن المستنسخ وكائن المصدر تمامًاالكائنات المستنسخة والكائنات المصدر مستقلة تمامًا عن بعضها البعض.
ستؤثر التغييرات التي تم إجراؤها في المثيل المستنسخ على المتغير المرجعي للكائن المصدرلن تؤثر التغييرات التي تم إجراؤها في المثيل المستنسخ على المتغير المرجعي للكائن المصدر.
الإصدار الافتراضي للنسخة هو النسخة الضحلةلإنشاء نسخة عميقة ، نحتاج إلى تجاوز طريقة النسخ لفئة الكائن.
تُفضل النسخة الضحلة إذا كانت متغيرات فئة الكائن هي فقط نوع بدائي كحقوليُفضل استخدام نسخة عميقة إذا كانت متغيرات فئة الكائن بها إشارات إلى كائنات أخرى مثل الحقول.
إنه سريع نسبيًاإنه بطيء نسبيًا.

بهذا نصل إلى نهاية مقالة Shallow Copy و Deep Copy. آمل أن تكون قد فهمت الاختلافات المختلفة بين الاثنين.

كيفية إنشاء إطار jframe

تفحص ال من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في مدونة 'النسخة الضحلة والنسخة العميقة' وسنعاود الاتصال بك في أقرب وقت ممكن.