Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دالة clone()

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 43 من 87.

تنشئ clone() method نسخة من object. لاستخدامها، يجب أن implement class الخاص بك الواجهة Cloneable وأن تُعيد تعريف method clone() من class Object.

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

يمكنك الآن إنشاء نسخ مستقلة من الكائنات:

Person original = new Person("Alice", 25);
Person copy = original.clone();
// copy هو كائن منفصل بنفس القيم

افتراضيًا، ينفّذ clone() نسخًا سطحيًا، ما يعني أنه ينسخ القيم البدائية والمراجع. إذا كان object الخاص بك يحتوي على objectات أخرى باعتبارها fields، فسوف يشير كلٌّ من original وclone إلى objectات متداخلة نفسها. للحصول على نسخ مستقلة حقًا تحتوي على objectات متداخلة، تحتاج إلى implement نسخًا عميقًا عن طريق استنساخ تلك objectات المتداخلة أيضًا داخل method ‏clone() الخاصة بك.

challenge icon

التحدي

سهل

لننشئ نظامًا لإدارة المستندات يوضّح استنساخ الكائنات. ستنشئ فئة Document يمكن استنساخها لإنشاء نسخ مستقلة، مما يتيح للمستخدمين تكرار المستندات مع الحفاظ على المستند الأصلي دون تغيير.

ستنظّم التعليمات البرمجية في ملفين:

  • Document.java: أنشئ فئة تمثّل مستندًا وتدعم الاستنساخ. يحتوي Document على ثلاثة حقول private: title (String)، وauthor (String)، وversion (int). أضف constructor لتهيئة جميع الحقول، وأضف getter methods لكل منها. أضف أيضًا method باسم setVersion(int version) لتحديث رقم الإصدار.

    اجعل فئة Document تنفّذ interface Cloneable، وأعد تعريف method clone() لإرجاع Document. عالج CloneNotSupportedException داخل method من خلال تغليفه داخل RuntimeException.

    أعد تعريف toString() لإرجاع: Document[title=X, author=Y, version=Z] حيث تمثّل X وY وZ قيم الحقول الفعلية.

  • Main.java: فعّل فئة Document من خلال إنشاء مستند واستنساخه. ستتلقى ثلاثة inputs: عنوانًا (String)، وauthor (String)، ورقم إصدار (int).

    أنشئ Document أصليًا باستخدام هذه القيم، ثم استنسخه لإنشاء نسخة. بعد الاستنساخ، عدّل version الخاص بالنسخة بزيادته بمقدار 1 باستخدام setVersion(). يوضّح هذا أن النسخة المستنسخة مستقلة حقًا عن المستند الأصلي.

    اطبع ثلاثة أسطر:

    1. Original: متبوعًا بـ toString() الخاص بالمستند الأصلي
    2. Clone: متبوعًا بـ toString() الخاص بالمستند المستنسخ
    3. Independent: متبوعًا بـ true أو false للإشارة إلى ما إذا كان المستند الأصلي والنسخة المستنسخة كائنين مختلفين (استخدم مقارنة !=)

ستتلقى ثلاثة inputs: عنوان المستند (String)، واسم author (String)، ورقم الإصدار (int).

لاحظ أنه بعد تعديل version الخاص بالنسخة المستنسخة، يظل المستند الأصلي دون تغيير. يثبت هذا أن clone() أنشأ نسخة مستقلة حقًا!

صيغة الإخراج المطلوبة: [المحتوى المترجم هنا]

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String title = scanner.nextLine();
        String author = scanner.nextLine();
        int version = scanner.nextInt();
        
        // TODO: إنشاء Document أصلي باستخدام قيم المدخلات
        
        // TODO: استنساخ المستند الأصلي لإنشاء نسخة
        
        // TODO: تعديل إصدار النسخة المستنسخة بزيادته بمقدار 1
        
        // TODO: طباعة "Original: " متبوعة بالمستند الأصلي
        
        // TODO: طباعة "Clone: " متبوعة بالمستند المستنسخ
        
        // TODO: طباعة "Independent: " متبوعة بـ true/false (التحقق مما إذا كان original != clone)
        
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت