Menu
Coddy logo textTech

מתודת clone()

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 43 מתוך 87.

המתודה clone() יוצרת עותק של אובייקט. כדי להשתמש בה, המחלקה שלך חייבת לממש את הממשק Cloneable ולדרוס את המתודה clone() מהמחלקה 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() מבצעת העתקה שטחית, כלומר היא מעתיקה ערכים פרימיטיביים והפניות. אם האובייקט שלך מכיל אובייקטים אחרים כשדות, גם המקור וגם השכפול יפנו לאותם אובייקטים מקוננים. כדי ליצור עותקים עצמאיים באמת עם אובייקטים מקוננים, עליך לממש העתקה עמוקה על ידי שכפול גם של אותם אובייקטים מקוננים בתוך המתודה clone() שלך.

challenge icon

אתגר

קל

בואו נבנה מערכת לניהול מסמכים שמדגימה שכפול אובייקטים. תיצור מחלקה בשם Document שאפשר לשכפל כדי ליצור עותקים עצמאיים, וכך המשתמשים יוכלו לשכפל מסמכים תוך שמירה על המסמך המקורי ללא שינוי.

תארגן את הקוד שלך בשני קבצים:

  • Document.java: צור מחלקה שמייצגת מסמך ותומכת בשכפול. למסמך יש שלושה שדות פרטיים: title (String), author (String) ו-version (int). הוסף בנאי שמאתחל את כל השדות ושיטות getter לכל אחד מהם. הוסף גם שיטה בשם setVersion(int version) לעדכון מספר הגרסה.

    הגדר שמחלקת Document מממשת את הממשק Cloneable, ודרוס את השיטה clone() כך שתחזיר אובייקט מסוג Document. טפל ב-CloneNotSupportedException בתוך השיטה על ידי עטיפתה ב-RuntimeException.

    דרוס את toString() כך שתחזיר: Document[title=X, author=Y, version=Z], כאשר X,‏ Y ו-Z הם ערכי השדות בפועל.

  • Main.java: הפעל את מחלקת Document על ידי יצירת מסמך ושכפולו. תקבל שלושה נתוני קלט: כותרת (String), שם מחבר (String) ומספר גרסה (int).

    צור מסמך מקורי עם הערכים האלה, ואז שכפל אותו כדי ליצור עותק. לאחר השכפול, שנה את הגרסה של העותק על ידי הגדלתה ב-1 באמצעות setVersion(). כך תדגים שהעותק המשוכפל אכן עצמאי מהמקור.

    הדפס שלוש שורות:

    1. Original: ואחריו התוצאה של toString() עבור המסמך המקורי
    2. Clone: ואחריו התוצאה של toString() עבור המסמך המשוכפל
    3. Independent: ואחריו true או false, המציינים אם המסמך המקורי והעותק המשוכפל הם אובייקטים שונים (השתמש בהשוואה !=)

תקבל שלושה נתוני קלט: כותרת המסמך (String), שם המחבר (String) ומספר הגרסה (int).

שים לב שלאחר שינוי הגרסה של העותק המשוכפל, המסמך המקורי נותר ללא שינוי. הדבר מוכיח ש-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 אונליין