מדריך לבנאים בג'אווה

1. הקדמה

בנאים הם שומרי הסף של עיצוב מונחה עצמים.

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

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

2. הקמת חשבון בנק

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

בנוסף, בואו נעקוף את toString שיטה להדפסת הפרטים למסוף:

class BankAccount {שם מחרוזת; LocalDateTime נפתח; איזון כפול; @ עקוב ציבורי מחרוזת למחרוזת () {החזר מחרוזת.פורמט ("% s,% s,% f", this.name, this.opened.toString (), this.balance); }} 

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

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

חשבון בנק חשבון = חשבון בנק חדש (); account.toString (); 

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

java.lang.NullPointerException ב- com.baeldung.constructors.BankAccount.toString (BankAccount.java:12) ב- com.baeldung.constructors.ConstructorUnitTest .givenNoExplicitContructor_whenUsed_thenFails (ConstructorUnitTest.java: 

3. בונה ללא ויכוח

בואו נתקן את זה עם קונסטרוקטור:

class BankAccount {public BankAccount () {this.name = ""; this.opened = LocalDateTime.now (); איזון זה = 0.0d; }} 

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

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

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

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

עבור אובייקטים, זה ריק, מה שהביא לחריג שראינו קודם.

4. קונסטרוקטור פרמטרי

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

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

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

class BankAccount {public BankAccount () {...} BankAccount ציבורי (שם מחרוזת, LocalDateTime נפתח, יתרה כפולה) {this.name = name; this.opened = נפתח; זה. איזון = איזון; }} 

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

 LocalDateTime נפתח = LocalDateTime.of (2018, חודש. JUNE, 29, 06, 30, 00); חשבון BankAccount = חשבון בנק חדש ("טום", נפתח, 1000.0f); account.toString (); 

שימו לב, כי בכיתה שלנו יש כעת 2 בונים. בונה ויכוח מפורש, ללא בנייה ובנאי פרמטרי.

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

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

5. בונה העתקות

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

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

BankAccount ציבורי (BankAccount אחר) {this.name = other.name; this.opened = LocalDateTime.now (); איזון זה = 0.0f; } 

עכשיו יש לנו את ההתנהגות הבאה:

LocalDateTime נפתח = LocalDateTime.of (2018, חודש. JUNE, 29, 06, 30, 00); חשבון בנק חשבון = חשבון בנק חדש ("טים", נפתח, 1000.0f); BankAccount newAccount = חשבון בנק חדש (חשבון); assertThat (account.getName ()). isEqualTo (newAccount.getName ()); assertThat (account.getOpened ()). isNotEqualTo (newAccount.getOpened ()); assertThat (newAccount.getBalance ()). isEqualTo (0.0f); 

6. קונסטרוקטור כבול

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

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

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

BankAccount ציבורי (שם מחרוזת, LocalDateTime נפתח, יתרה כפולה) {this.name = name; this.opened = נפתח; זה. איזון = איזון; } BankAccount ציבורי (שם מחרוזת) {this (name, LocalDateTime.now (), 0.0f); }

עם מילת המפתח זֶה, אנחנו קוראים לבנאי השני.

עלינו לזכור זאת אם אנו רוצים לשרשר קונסטרוקטור של מחלקה-על עלינו להשתמש סוּפֶּר במקום זֶה.

זכרו זאת זֶה אוֹ סוּפֶּר הביטוי צריך להיות תמיד ההצהרה הראשונה.

7. סוגי ערכים

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

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

בואו נמשיך ויצור שיעור בלתי משתנה:

Transaction class {final BankAccount bankAccount; תאריך LocalDateTime סופי; סכום כפול סופי; עסקה ציבורית (חשבון בנק חשבון, תאריך LocalDateTime, סכום כפול) {this.bankAccount = חשבון; תאריך זה = תאריך; this.amount = סכום; }} 

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

אם ניצור מספר בונים עבור ה- עִסקָה בכיתה, כל קונסטרוקטור יצטרך לאתחל כל משתנה סופי. אי פעולה זו תביא לשגיאת אוסף.

8. מסקנה

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

כמו תמיד, ניתן למצוא דוגמאות קוד ב- GitHub.