CodeGym /בלוג Java /Random-HE /שיעורי עטיפה בג'אווה
John Squirrels
רָמָה
San Francisco

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

פורסם בקבוצה
היי! אתה כבר מכיר היטב טיפוסים פרימיטיביים, ועבדת איתם לא מעט. בתכנות (וג'אווה בפרט), לפרימיטיבים יש יתרונות רבים: הם משתמשים בזיכרון מועט (ובכך הופכים את התוכנית ליעילה יותר) ויש להם טווח ערכים מסודר בבירור. עם זאת, תוך כדי לימוד ג'אווה, כבר חזרנו לא פעם על המנטרה "הכל ב-Java הוא אובייקט". אבל פרימיטיביים סותרים ישירות את המילים הללו. הם לא חפצים. אז האם עקרון "הכל אובייקט" שלנו שגוי? למעשה, זה לא. בג'אווה, לכל טיפוס פרימיטיבי יש אח תאום, כיתת עטיפה.

מה זה שיעור עטיפה?

עטיפה היא מחלקה מיוחדת המאחסנת פרימיטיבי פנימי. אבל בגלל שזה מחלקה, אתה יכול ליצור מופעים שלה. הם מאחסנים את הערכים הפרימיטיביים באופן פנימי, אך הם עדיין אובייקטים אמיתיים. שמות מחלקות עטיפה דומים מאוד לשמות הפרימיטיביים המקבילים (או זהים בדיוק ל). אז קל לזכור אותם.
שיעורי עטיפה לסוגי נתונים פרימיטיביים
סוגי נתונים פרימיטיביים שיעורי עטיפה
int מספר שלם
קצר קצר
ארוך ארוך
בייט בייט
לָצוּף לָצוּף
לְהַכפִּיל לְהַכפִּיל
לְהַשְׁחִיר אופי
בוליאני בוליאנית
אובייקטי עטיפה נוצרים באותו אופן כמו כל אובייקט אחר:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
שיעורי עטיפה מאפשרים לנו לצמצם את החסרונות של טיפוסים פרימיטיביים. הברור ביותר הוא שלפרימיטיבים אין שיטות. לדוגמה, אין להם מתודה toString() , כך שאתה לא יכול, למשל, להמיר int ל- String . אבל מחלקה של עטיפה שלמה עושה את זה קל.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
עם זאת, המרה בכיוון השני יכולה להיות מסובכת יותר. נניח שיש לנו מחרוזת , שאנו יודעים בוודאות שמכילה מספר. בלי קשר, אין דרך מקורית להשתמש ב- int פרימיטיבי כדי לחלץ את המספר מהמחרוזת ולהמיר אותו למספר. אבל, אנחנו יכולים עם שיעורי העטיפה.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
תְפוּקָה:
1166628
חילצנו בהצלחה מספר מהמחרוזת והקצנו אותו למשתנה ההתייחסות Integer i . אגב, לגבי הפניות. אתה כבר יודע שארגומנטים מועברים לשיטות בדרכים שונות: פרימיטיבים לפי ערך, ואובייקטים לפי הפניה. אתה יכול להשתמש בידע הזה בעת יצירת שיטות משלך: לדוגמה, אם השיטה שלך משתמשת במספרים שברים אבל אתה צריך היגיון כדי להעביר באמצעות הפניה, אתה יכול להעביר ארגומנטים Double / Float לשיטה במקום כפול / float . בנוסף לשיטות של כיתות עטיפה, השדות הסטטיים שלהן יכולים להיות גם מאוד נוחים. לדוגמה, דמיין שיש לך את המשימה הבאה: הצג את ערך ה-int המקסימלי האפשרי , ואחריו הערך המינימלי האפשרי. בעיה זו נראית בסיסית למדי. אבל בלי גוגל, לא סביר שתצליחו לעשות את זה. אבל עטיפות מאפשרות לך להתמודד בקלות עם "משימות ארציות" כאלה:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
שדות אלה מונעים ממך להסיח את דעתך מביצוע משימות רציניות יותר. שלא לדבר על העובדה שהקלדת 2147483647 (שזה במקרה הערך של MAX_VALUE) אינה הישג של מה בכך! :) יתרה מכך, בשיעור קודם, ציינו שחפצי עטיפה אינם ניתנים לשינוי.
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
תְפוּקָה:
0
המצב של האובייקט שעליו הצביע במקור a לא השתנה (מכיוון שגם הערך של b היה משתנה). כמו ב- String s, במקום לשנות את מצב אובייקט העטיפה, נוצר אובייקט חדש לגמרי בזיכרון. אז מדוע החליטו בסופו של דבר יוצרי Java להשאיר טיפוסים פרימיטיביים בשפה? מכיוון שהכל צריך להיות אובייקט, וקיבלנו שיעורי עטיפה שיכולים לבטא את כל מה שפרימיטיביים מבטאים, למה לא רק לשמור את העטיפות בשפה ולהסיר את הפרימיטיביים? התשובה פשוטה: ביצועים. טיפוסים פרימיטיביים נקראים פרימיטיביים מכיוון שחסרים להם הרבה מהתכונות ה"כבדות" של עצמים. כן, לחפצים יש הרבה שיטות נוחות, אבל לא תמיד צריך אותם. לפעמים, כל מה שאתה צריך הוא המספר 33, או 2.62, או נכון / לא נכון . במצבים שבהם היתרונות של אובייקטים אינם חשובים ואינם נדרשים כדי שהתוכנית תפעל, פרימיטיביים מתאימים הרבה יותר למשימה.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION