שיטת Java toString ()

1. סקירה כללית

כל כיתה בג'אווה היא ילדה של לְהִתְנַגֵד בכיתה באופן ישיר או עקיף. ומאז ה לְהִתְנַגֵד הכיתה מכילה א toString () שיטה, אנחנו יכולים להתקשר toString () בכל מקרה וקבל את ייצוג המיתרים שלו.

במדריך זה, נסתכל על התנהגות ברירת המחדל של toString () ולמד כיצד לשנות את התנהגותה.

2. התנהגות ברירת מחדל

בכל פעם שאנחנו מדפיסים הפניה לאובייקט, היא קוראת ל toString () שיטה פנימית. אז אם אנחנו לא מגדירים a toString () השיטה בכיתה שלנו, אם כן לְהִתְנַגֵד#toString () מופעלת.

אובייקטיםtoString () השיטה היא די כללית:

מחרוזת ציבורית toString () {return getClass (). getName () + "@" + Integer.toHexString (hashCode ()); }

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

לקוח בכיתה ציבורית {פרטי מחרוזת שם פרטי; שם משפחה פרטי מחרוזת; // גטרים וקובעים סטנדרטיים. אין יישום toString ()}

עכשיו, אם ננסה להדפיס את גלקוח לְהִתְנַגֵד, לְהִתְנַגֵד#toString () ייקרא, והפלט יהיה דומה ל:

[מוגן בדוא"ל]

3. עקיפת התנהגות ברירת מחדל

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

על ידי עקיפת התנהגות ברירת המחדל של toString () בשיטה, אנו יכולים להפוך את הפלט של שיחת השיטה למשמעותית יותר.

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

4. סוגים פרימיטיביים ו מיתרים

שֶׁלָנוּ צרכן לאובייקט יש את שניהם חוּט ותכונות פרימיטיביות. עלינו לעקוף את toString () שיטה להשגת תפוקה משמעותית יותר:

מעמד ציבורי CustomerPrimitiveToString מאריך את הלקוח {יתרה ארוכה פרטית; @ עקוב ציבורי מחרוזת toString () {להחזיר "לקוח [balance =" + balance + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

בואו נראה מה נקבל כשאנחנו מתקשרים toString () עַכשָׁיו:

@Test הציבור בטל givenPrimitive_whenToString_thenCustomerDetails () {CustomerPrimitiveToString לקוח = CustomerPrimitiveToString חדש (); customer.setFirstName ("רג'ש"); customer.setLastName ("בהוג'וואני"); customer.setBalance (110); assertEquals ("לקוח [איזון = 110, getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

5. אובייקטים מורכבים של Java

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

אז בואו נעקוף toString () שוב:

מחלקה ציבורית CustomerComplexObjectToString מאריך את הלקוח {הזמנת הזמנה פרטית; // סטרים וקובעים סטנדרטיים @Override ציבור מחרוזת toString () {החזר "לקוח [order =" + order + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "] "; }}

מאז להזמין הוא אובייקט מורכב, אם רק נדפיס את שלנו צרכן אובייקט, מבלי לעקוף את toString () השיטה שלנו להזמין בכיתה, היא תודפס הזמנות כפי ש [מוגן בדוא"ל].

כדי לתקן את זה בואו נעקוף toString () ב להזמיןגם:

סדר ציבורי ציבורי {פרטי OrderId מחרוזת; פרטי מחרוזת ערך ארוך פרטי; סטטוס מחרוזת פרטי; @ עקוב ציבורי מחרוזת toString () {return "Order [orderId =" + orderId + ", desc =" + desc + ", value =" + value + "]"; }} 

עכשיו בואו נראה מה קורה כשאנחנו קוראים toString () שיטה על שלנו צרכן אובייקט המכיל להזמין תְכוּנָה:

@ מבחן חלל ציבורי givenComplex_whenToString_thenCustomerDetails () {CustomerComplexObjectToString client = new CustomerComplexObjectToString (); // .. להגדיר לקוח כמו לפני הזמנת הזמנה = הזמנה חדשה (); order.setOrderId ("A1111"); order.setDesc ("משחק"); order.setStatus ("משלוח בתוך המשלוח"); customer.setOrders (הזמנה); assertEquals ("Customer [order = Order [orderId = A1111, desc = Game, value = 0]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

6. מערך אובייקטים

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

כדי לתקן את זה בואו נשתמש Arrays.toString () בשביל ה הזמנות שדה:

מחלקה ציבורית CustomerArrayToString מאריך לקוחות {הזמנות פרטיות []; @ עקוב ציבורי מחרוזת toString () {return "לקוח [orders =" + Arrays.toString (orders) + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]" ; }} 

בואו נראה את התוצאות של קריאה לעיל toString () שיטה:

@ מבחן בטל פומבי givenArray_whenToString_thenCustomerDetails () {CustomerArrayToString לקוח = CustomerArrayToString חדש (); // .. להגדיר לקוח כמו קודם // .. להגדיר הזמנה כמו לפני customer.setOrders (הזמנה חדשה [] {order}); assertEquals ("לקוח [orders = [Order [orderId = A1111, desc = משחק, value = 0]]," + "getFirstName () = Rajesh, getLastName () = Bhojwani]", customer.toString ()); }

7. עטיפות, אוספים ו StringBuffers

כאשר אובייקט מורכב כולו מעטיפות, אוספים או StringBufferללא שום מנהג toString () יישום נדרש מכיוון שאובייקטים אלה כבר ביטלו את toString () שיטה עם ייצוגים משמעותיים:

מחלקה ציבורית CustomerWrapperCollectionToString מאריך את הלקוח {ציון שלם פרטי; // אובייקט מחלקה עוטף פרטי הזמנות רשימה; // אובייקט האוסף פרטי StringBuffer מלא; // אובייקט StringBuffer @ עקירה ציבורית מחרוזת toString () {החזר "לקוח [score =" + ציון + ", הזמנות =" + הזמנות + ", fullname =" + fullname + ", getFirstName () =" + getFirstName () + ", getLastName () =" + getLastName () + "]"; }} 

בואו נראה שוב את תוצאות השיחה toString ():

@Test ציבור בטל givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails () {CustomerWrapperCollectionToString לקוח = CustomerWrapperCollectionToString חדש (); // .. להגדיר לקוח כמו קודם // .. להגדיר הזמנות כמו לפני customer.setOrders (הזמנה חדשה [] {order}); StringBuffer fullname = new StringBuffer (); fullname.append (customer.getLastName () + "," + customer.getFirstName ()); assertEquals ("לקוח [ציון = 8, הזמנות = [ספר, עט], שם מלא = בוג'וואני, ראג'ש, getFirstName () = ראג'ש," + "getLastName () = בוג'וואני]", customer.toString ()); }

8. מסקנה

במאמר זה בדקנו יצירת יישומים משלנו של ה- toString () שיטה.

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


$config[zx-auto] not found$config[zx-overlay] not found