מתודת 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() שלך.
אתגר
קלבואו נבנה מערכת לניהול מסמכים שמדגימה שכפול אובייקטים. תיצור מחלקה בשם 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(). כך תדגים שהעותק המשוכפל אכן עצמאי מהמקור.הדפס שלוש שורות:
Original:ואחריו התוצאה של toString() עבור המסמך המקוריClone:ואחריו התוצאה של toString() עבור המסמך המשוכפל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)
}
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין