סוגי גלם בג'אווה

1. הקדמה

במדריך מהיר זה, אנו נסתכל על סוגי גלם, מה הם ומדוע עלינו להימנע מהם.

2. סוגי גלם

סוג גולמי הוא שם עבור ממשק כללי או מחלקה ללא ארגומנט הסוג שלו:

רשימת רשימה = ArrayList חדש (); // סוג גולמי

במקום:

List listIntgrs = ArrayList new (); // סוג פרמטר

רשימה הוא סוג פרמטר של ממשק רשימה בזמן רשימה הוא סוג גולמי של ממשק רשימה.

סוגים גולמיים יכולים להיות שימושיים כאשר הם מתממשקים עם קוד מדור קודם שאינו כללי.

אחרת, אם כי, זה מיואש. זה בגלל ש:

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

3. לא מבטא

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

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

בואו נראה את החתימה של השיטה קבל (אינדקס int) בתוך ה רשימה ממשק כדי להבין זאת טוב יותר:

/ ** * מחזיר את האלמנט במיקום שצוין ברשימה זו. * * אינדקס אינדקס של פארם של האלמנט כדי להחזיר * @ החזר את האלמנט במיקום שצוין ברשימה זו * @ זורק IndexOutOfBoundsException אם המדד מחוץ לטווח * (אינדקס = גודל ()) * / E קבל (אינדקס int) ;

השיטה קבל (אינדקס int) מחזירה א חוּט בעמדה אינדקס בסוג פרמטר רשימה.

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

4. לא בטיחותי

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

בואו נראה את זה על ידי יצירת קוד שמייצר a רשימה לפני שמעבירים אותו לשיטה שמקבלת סוג גולמי רשימה ומוסיף an מספר שלם לזה:

method void publicA () {List parameterizedList = ArrayList new (); parameterizedList.add ("שלום אנשים"); methodB (רשימת פרמטרים); } שיטת הריק הציבורי B (רשימת rawList) {// סוג raw! rawList.add (1); }

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

המהדר מדפיס אזהרה עקב השימוש בסוגי גלם:

הערה: RawTypeDemo.java משתמש בפעולות לא מסומנות או לא בטוחות. הערה: הידור מחדש עם -Xlint: לא מסומן לפרטים.

5. בעיות בזמן זמן ריצה

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

בואו ונשתנה את הדוגמה הקודמת כך שיטה A. מקבל את האלמנט במיקום האינדקס 1 שלנו רשימה אחרי שהתקשר שיטה B.:

method void publicA () {List parameterizedList = ArrayList new (); parameterizedList.add ("שלום אנשים"); methodB (רשימת פרמטרים); מחרוזת s = parameterizedList.get (1); } שיטת הריק הציבורי B (רשימה rawList) {rawList.add (1); }

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

חריג בשרשור "ראשי" java.lang.ClassCastException: java.lang.Integer לא ניתן להטלה ל- java.lang.String

6. מסקנה

קשה לעבוד עם סוגים גולמיים ויכולים להכניס באגים בקוד שלנו.

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

בדוק את כל התמציות במדריך זה ב- GitHub.


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