שיעורי עטיפה בג'אווה

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

כמו שהשם מרמז, שיעורי עטיפה הם אובייקטים המעטפים סוגי Java פרימיטיביים.

לכל פרימיטיבי Java יש מעטפת מתאימה:

  • בוליאני, בייט, קצר, צ'אר, אינט, ארוך, צף, כפול
  • בוליאני, בייט, קצר, אופי, שלם, ארוך, צף,לְהַכפִּיל

כל אלה מוגדרים ב java.lang חבילה, ולכן איננו צריכים לייבא אותם ידנית.

2. שיעורי עטיפה

"מה המטרה של שיעור עטיפה?". זו אחת השאלות הנפוצות ביותר לראיונות Java.

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

לדוגמא, Java Collection Framework עובד עם אובייקטים באופן בלעדי. זמן רב אחורה כאשר (לפני Java 5, כמעט 15 שנים אחורה) לא הייתה תיבה אוטומטית ואנחנו, למשל, לא יכולנו פשוט להתקשר הוסף (5) על אוסף של שלמים.

באותה תקופה, אלה פְּרִימִיטִיבִי יש להמיר ערכים באופן ידני ל- תוֹאֵם שיעורי עטיפה ומאוחסנים באוספים.

היום, עם תיבת אוטומטית, אנו יכולים לעשות זאת בקלות ArrayList.add (101) אך באופן פנימי ג'אווה ממירה את הערך הפרימיטיבי ל- מספר שלם לפני שמאחסן אותו ב רשימת מערך משתמש ב ערך של() שיטה.

3. פרימיטיבי להמרת כיתת עטיפה

כעת השאלה הגדולה היא: כיצד נמיר ערך פרימיטיבי למחלקת עטיפה מקבילה למשל. an int ל מספר שלם או א לְהַשְׁחִיר ל אופי?

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

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

כך מומלץ מאוד להשתמש רק בשיטות המפעל בקוד חדש.

בואו נראה דוגמה להמרת int ערך ל- מספר שלם אובייקט ב- Java:

אובייקט שלם = שלם חדש (1); שלם AnotherObject = Integer.valueOf (1);

ה ערך של() השיטה מחזירה מופע המייצג את המצוין int ערך.

הוא מחזיר ערכים במטמון מה שהופך אותו ליעיל. זה תמיד שומר במטמון ערכים בין -128 עד 127, אך יכול גם לשמור במטמון ערכים אחרים מחוץ לטווח זה.

באופן דומה, אנו יכולים גם להמיר בוליאני ל בוליאני, בתים ל בייט, צ'אר ל אופי, ארוך ל ארוך, צף ל לָצוּף, ו לְהַכפִּיל ל לְהַכפִּיל. אם כי אם עלינו להמיר מחרוזת למספר שלם, עלינו להשתמש בה parseInt () שיטה כי חוּט אינו שיעור עטיפה.

מצד שני, כדי להמיר מאובייקט עטיפה לערך פרימיטיבי, נוכל להשתמש בשיטה המתאימה כגון intValue (), doubleValue ()וכו:

int val = object.intValue (); 

ניתן למצוא כאן הפניה מקיפה.

4. תיבה אוטומטית ו Unboxing

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

אחרי Java 5, המרה זו יכולה להיעשות באופן אוטומטי באמצעות תכונות הנקראות תיבה אוטומטית ואי-איגרוף.

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

בדומה לכך, כאשר אובייקט עטיפה נפרש לערך פרימיטיבי, זה ידוע כ- Unboxing.

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

רשימת רשימה = ArrayList חדש (); list.add (1); // תיבה אוטומטית שלם val = 2; // תיבה אוטומטית

בדוגמה זו, ג'אווה תמיר באופן אוטומטי את הפרימיטיבי int ערך לעטיפה.

באופן פנימי, הוא משתמש ב- ערך של() שיטה כדי להקל על ההמרה. לדוגמה, השורות הבאות שוות ערך:

ערך שלם = 3; ערך שלם = Integer.valueOf (3);

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

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

אובייקט שלם = שלם חדש (1); int val1 = getSquareValue (אובייקט); // unboxing int val2 = אובייקט; // ביטול האגרוף של סטטי ציבורי int getSquareValue (int i) {return i * i; }

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

5. מסקנה

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