مثل سي++، جافا كما يدعم منشئ النسخ . ولكن في سي ++ يتم إنشاؤه بشكل افتراضي. أثناء وجودنا في Java، نحدد مُنشئ النسخ الخاص بنا. في هذا القسم سوف نتعلم نسخ المنشئ في جافا مع مثال .
البناء
في جافا، أ البناء هو نفس الأسلوب ولكن الاختلاف الوحيد هو أن المُنشئ له نفس اسم اسم الفئة. يتم استخدامه لإنشاء مثيل للفئة. يتم استدعاؤه تلقائيًا عندما نقوم بإنشاء كائن من الفئة. ليس لديها نوع العودة. تذكر أن المنشئ لا يمكن أن يكون خلاصة , أخير , متزامن ، و ثابتة . لا يمكننا تجاوز المنشئ. يشغل بعض المساحة في الذاكرة عند استدعائه.
أنواع المنشئ
- المنشئ الافتراضي
- منشئ المعلمة
باستثناء المنشئين المذكورين أعلاه، تدعم Java أيضًا مُنشئ النسخ. دعونا نناقش الأمر بالتفصيل.
لماذا مطلوب منشئ النسخ؟
في بعض الأحيان، نواجه مشكلة حيث نطلب إنشاء نسخة طبق الأصل من كائن موجود في الفصل. وهناك شرط أيضًا، إذا أحدثنا أي تغيير في النسخة فلا ينعكس على الأصل، والعكس صحيح. في مثل هذه الحالات، توفر Java مفهوم منشئ النسخ .
نسخ المنشئ
في Java، مُنشئ النسخ هو نوع خاص من المنشئ الذي يقوم بإنشاء كائن باستخدام كائن آخر من نفس فئة Java. تقوم بإرجاع نسخة مكررة من كائن موجود في الفئة.
يمكننا تعيين قيمة للحقل النهائي ولكن لا يمكن فعل الشيء نفسه أثناء استخدام طريقة clone(). يتم استخدامه إذا أردنا إنشاء نسخة عميقة من كائن موجود. إنه أسهل في التنفيذ مقارنة بطريقة clone ().
ملحوظة: لا يمكن وراثتها بواسطة الفئات الفرعية. إذا حاولنا تهيئة كائن فئة فرعية من مرجع فئة أصل، فسنواجه مشكلة الإرسال عند استنساخه باستخدام مُنشئ النسخة.
استخدام منشئ النسخ
يمكننا استخدام مُنشئ النسخ إذا أردنا:
- إنشاء نسخة من كائن يحتوي على حقول متعددة.
- إنشاء نسخة عميقة من الأشياء الثقيلة.
- تجنب استخدام الأسلوب Object.clone().
مزايا منشئ النسخ
- إذا تم إعلان الحقل كحقل نهائي، فيمكن لمنشئ النسخة تغييره.
- ليست هناك حاجة للطباعة.
- يكون استخدامه أسهل إذا كان الكائن يحتوي على عدة حقول.
- من السهل إضافة حقل إلى الفصل بسبب ذلك. نحن بحاجة إلى تغيير فقط في منشئ النسخة.
إنشاء منشئ نسخة
لإنشاء مُنشئ نسخة في Java، اتبع الخطوات الواردة أدناه:
- قم بإنشاء مُنشئ يقبل كائنًا من نفس الفئة كمعلمة.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- انسخ كل كائن حقل (متغير) إلى المثيل الذي تم إنشاؤه حديثًا.
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //copying each filed this.price = fruits.price; //getter this.name = fruits.name; //getter } }
مثال على منشئ النسخ
CopyConstructorExample.java
public class Fruit { private double fprice; private String fname; //constructor to initialize roll number and name of the student Fruit(double fPrice, String fName) { fprice = fPrice; fname = fName; } //creating a copy constructor Fruit(Fruit fruit) { System.out.println(' After invoking the Copy Constructor: '); fprice = fruit.fprice; fname = fruit.fname; } //creating a method that returns the price of the fruit double showPrice() { return fprice; } //creating a method that returns the name of the fruit String showName() { return fname; } //class to create student object and print roll number and name of the student public static void main(String args[]) { Fruit f1 = new Fruit(399, 'Ruby Roman Grapes'); System.out.println('Name of the first fruit: '+ f1.showName()); System.out.println('Price of the first fruit: '+ f1.showPrice()); //passing the parameters to the copy constructor Fruit f2 = new Fruit(f1); System.out.println('Name of the second fruit: '+ f2.showName()); System.out.println('Price of the second fruit: '+ f2.showPrice()); } }
انتاج:
Name of the first fruit: Ruby Roman Grapes Price of the first fruit: 399.0 After invoking the Copy Constructor: Name of the second fruit: Ruby Roman Grapes Price of the second fruit: 399.0
نسخ طريقة المُنشئ مقابل الاستنساخ ().
يتم استخدام كل من مُنشئ النسخ وطريقة clone () لإنشاء نسخة من كائن موجود في الفئة. لكن استخدام مُنشئ النسخ أسهل وأفضل مقارنةً بطريقة clone() للأسباب الموضحة أدناه:
- إذا كنا نستخدم طريقة clone() فمن الضروري استيراد ملف قابل للاستنساخ قد يطرح الأسلوب الاستثناء CloneNotSupportException. لذا، فإن معالجة الاستثناء في البرنامج مهمة معقدة. بينما في منشئ النسخ لا توجد مثل هذه التعقيدات.
- لا يمكننا تعيين قيمة إذا كانت الحقول كذلك أخير . أثناء وجودنا في مُنشئ النسخ يمكننا تعيين قيم للحقول النهائية.
- يجب أن يكون الكائن الذي تم إرجاعه بواسطة طريقة clone (). تلبيس . بينما في منشئ النسخ لا يوجد مثل هذا الشرط.