בונה העתקות Java

1. הקדמה

בונה העתקות בשיעור Java הוא בונה ש יוצר אובייקט באמצעות אובייקט אחר מאותו מחלקה Java.

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

2. כיצד ליצור בונה העתקות

כדי ליצור בונה העתקות נוכל להכריז תחילה על בונה שלוקח אובייקט מאותו סוג כפרמטר:

עובד בכיתה ציבורית {מזהה פרטי פרטי; שם מחרוזת פרטי; עובד ציבורי (עובד שכיר) {}}

לאחר מכן אנו מעתיקים כל שדה של אובייקט הקלט למופע החדש:

עובד בכיתה ציבורית {מזהה פרטי פרטי; שם מחרוזת פרטי; עובד ציבור (עובד שכיר) {this.id = עובד.יד; this.name = עובד.שם; }}

מה שיש לנו כאן הוא עותק רדודוזה בסדר מכיוון שכל התחומים שלנו - int ו חוּט במקרה זה - הם סוגים פרימיטיביים או טיפוסים בלתי ניתנים לשינוי.

אם למחלקת Java יש שדות ניתנים לשינוי, אנו יכולים במקום זאת לעשות עותק עמוק בתוך בונה ההעתקים שלו. עם העתק עמוק, האובייקט החדש שנוצר אינו תלוי בזה המקורי מכיוון שאנחנו יוצרים עותק מובחן של כל אובייקט משתנה:

עובד בכיתה ציבורית {מזהה פרטי פרטי; שם מחרוזת פרטי; תאריך התחלה תאריך פרטי; עובד ציבורי (עובד שכיר) {this.id = עובד.יד; this.name = עובד.שם; this.startDate = תאריך חדש (employee.startDate.getTime ()); }}

3. העתק קונסטרוקטור לעומת שיבוט

ב- Java, אנו יכולים גם להשתמש ב- שיבוט שיטה ליצירת אובייקט מאובייקט קיים. עם זאת, לבנאי ההעתקים יש כמה יתרונות על פני שיבוט שיטה:

  1. בונה ההעתקות קל הרבה יותר ליישום. אנחנו לא צריכים ליישם את ניתנת לשיבוט ממשק וידית CloneNotSupportedException.
  2. ה שיבוט שיטה מחזירה כללי לְהִתְנַגֵד התייחסות. לכן, עלינו להקליד אותו לסוג המתאים.
  3. איננו יכולים להקצות ערך ל- a סופי שדה ב שיבוט שיטה. עם זאת, אנו יכולים לעשות זאת בבנאי ההעתקים.

4. סוגיות בירושה

בוני העתקות בג'אווה אינם עוברים בתורשה על ידי מחלקות משנה. לכן, אם ננסה לאתחל אובייקט ילד מהפניה לכיתת הורים, אנו נתמודד עם נושא ליהוק בעת שיבוט זה עם בונה ההעתקים.

כדי להמחיש נושא זה, ראשית ניצור תת-מחלקה של עוֹבֵד ובונה ההעתקים שלו:

מנהל מחלקה ציבורית מרחיב את העובד {Private List DirectReports; // ... בונים אחרים מנהל ציבורי (מנהל מנהל) {סופר (manager.id, manager.name, manager.startDate); this.directReports = directReports.stream () .collect (Collectors.toList ()); }} 

לאחר מכן, אנו מכריזים על עוֹבֵד משתנה ומייד את זה באמצעות מנהל בַּנַאִי:

מקור לעובד = מנהל חדש (1, "מנהל Baeldung", startDate, directReports);

מכיוון שסוג הייחוס הוא עוֹבֵדאנחנו חייבים ללהק את זה ל מנהל הקלד כדי שנוכל להשתמש בבנאי ההעתקים של ה- מנהל מעמד:

שיבוט עובדים = מקור מנהל חדש ((מנהל));

אנו עשויים לקבל ClassCastException בזמן ריצה אם אובייקט הקלט אינו מופע של מנהל מעמד.

אחת הדרכים להימנע מליהוק לבנאי ההעתקים היא ליצור שיטה תורשתית חדשה לשני הכיתות:

שכבה ציבורית עובד {העתק עובד ציבורי () {החזר עובד חדש (זה); }} מנהל המחלקה הציבורית מרחיב את העובד {@ העתק עובד העתק העובד הציבורי () {להחזיר מנהל חדש (זה); }}

בכל שיטת מחלקה אנו מכנים את בונה ההעתקות שלו עם הקלט זֶה לְהִתְנַגֵד. בדרך זו אנו יכולים להבטיח כי האובייקט שנוצר שווה לאובייקט המתקשר:

שיבוט עובדים = source.copy ();

5. מסקנה

במדריך זה הראינו כיצד ליצור בונה העתקות עם כמה דוגמאות קוד. כמו כן, דנו בכמה סיבות מדוע עלינו להימנע מ- שיבוט שיטה.

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

כמו תמיד, קוד המקור של ההדרכה זמין ב- GitHub.