מדריך למילת המפתח הסטטית בג'אווה

1. הקדמה

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

2. האנטומיה של סטָטִי מילת מפתח

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

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

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

3. ה סטָטִי שדות (או משתני מחלקה)

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

מנקודת מבט הזיכרון, משתנים סטטיים נכנסים למאגר מסוים בזיכרון JVM הנקרא Metaspace (לפני Java 8 נקראה הבריכה הזו Permanent Generation או PermGen, שהוסרה לחלוטין והוחלפה ב- Metaspace).

3.1. דוגמה ל סטָטִי שדה

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

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

זה המקום סטָטִי משתנים נכנסים:

רכב בכיתה ציבורית {שם מחרוזת פרטי; מנוע מחרוזת פרטי; number intic static publicOfCars; רכב ציבורי (שם מחרוזת, מנוע מחרוזת) {this.name = שם; this.engine = מנוע; numberOfCars ++; } // גטרים וקובעים}

עכשיו עבור כל אובייקט מהמחלקה הזו שמתאתחל, אותו עותק של ה- numberOfCars משתנה מוגבר. אז במקרה זה, הטענות הבאות יהיו נכונות:

@ מבחן ציבורי בטל כאשר NumberOfCarObjectsInitialized_thenStaticCounterIncreases () {מכונית חדשה ("יגואר", "V8"); מכונית חדשה ("בוגאטי", "W16"); assertEquals (2, Car.numberOfCars); }

3.2. סיבות משכנעות לשימוש סטָטִי שדות

  • כאשר ערך המשתנה אינו תלוי באובייקטים
  • כאשר הערך אמור להיות משותף בין כל האובייקטים

3.3. נקודות מפתח שיש לזכור

  • מאז סטָטִי משתנים שייכים למחלקה, ניתן לגשת אליהם ישירות באמצעות שם המחלקה ואינם זקוקים לשום הפניה לאובייקט
  • סטָטִי ניתן להכריז על משתנים ברמת הכיתה בלבד
  • סטָטִי ניתן לגשת לשדות ללא אתחול האובייקט
  • למרות שאנחנו יכולים לגשת סטָטִי שדות באמצעות הפניה לאובייקט (כמו ford.numberOfCars ++), עלינו להימנע משימוש בו מכיוון שבמקרה זה נהיה קשה להבין אם זה משתנה מופע או משתנה מחלקה; במקום זאת, עלינו תמיד להתייחס סטָטִי משתנים המשתמשים בשם המחלקה (למשל, במקרה זה, Car.numberOfCars ++)

4. ה סטָטִי שיטות (או שיטות כיתה)

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

4.1. דוגמא של סטָטִי שיטה

סטָטִי בדרך כלל משתמשים בשיטות לביצוע פעולה שאינה תלויה ביצירת מופע.

אם יש קוד שאמור להיות משותף בכל המקרים של אותה מחלקה, כתוב את הקוד הזה ב סטָטִי שיטה:

בטל סטטי פומבי setNumberOfCars (int numberOfCars) {Car.numberOfCars = numberOfCars; }

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

רק התבונן בשיעורי אוספים או שיעורי מתמטיקה מ- JDK, StringUtils מ- Apache או CollectionUtils מ- Spring במסגרת ושים לב שכל השיטות הן סטָטִי.

4.2. סיבות משכנעות לשימוש סטָטִי שיטות

  • לגישה / מניפולציה של משתנים סטטיים ושיטות סטטיות אחרות שאינן תלויות באובייקטים
  • סטָטִי נעשה שימוש נרחב בשיטות בשיעורי שירות ועוזרים

4.3. נקודות מפתח שיש לזכור

  • סטָטִי השיטות ב- Java נפתרות בזמן הידור. מכיוון שעקיפת השיטה היא חלק מפולימורפיזם זמן ריצה, לכן אי אפשר לבטל שיטות סטטיות
  • שיטות מופשטות אינן יכולות להיות סטטיות
  • סטָטִי שיטות אינן יכולות להשתמש זֶה אוֹ סוּפֶּר מילות מפתח
  • השילובים הבאים של המופע, שיטות המחלקה והמשתנים תקפים:
    1. שיטות מופע יכולות לגשת ישירות לשתי מופעים ולמשתני מופע
    2. ניתן לגשת לשיטות מופע סטָטִי משתנים ו סטָטִי שיטות באופן ישיר
    3. סטָטִי שיטות יכולות לגשת לכל סטָטִי משתנים ואחרים סטָטִי שיטות
    4. סטָטִי שיטות אינן יכולות לגשת ישירות למשתני מופעים ולשיטות מופע; הם זקוקים לאיזה התייחסות לאובייקט כדי לעשות זאת

5. א סטָטִי לַחסוֹם

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

במקרים כאלו, סטָטִי בלוקים שימושיים.

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

5.1. ה סטָטִי דוגמה לחסימה

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

זה הופך להיות קל עם סטָטִי חסימות:

מעמד ציבורי StaticBlockDemo {דרגה רשימת סטטי ציבורי = חדש LinkedList (); סטטי {ranks.add ("סגן"); ranks.add ("קפטן"); ranks.add ("מייג'ור"); } סטטי {ranks.add ("קולונל"); ranks.add ("כללי"); }}

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

5.2. סיבות משכנעות לשימוש סטָטִי בלוקים

  • אם אתחול של סטָטִי משתנים דורשים היגיון נוסף למעט ההקצאה
  • אם האתחול של משתנים סטטיים מועד לשגיאה ודורש טיפול בחריגים

5.3. נקודות מפתח שיש לזכור

  • בכיתה יכול להיות מספר רב סטָטִי חסימות
  • סטָטִי שדות ו סטָטִי בלוקים נפתרים ומבוצעים באותו סדר כפי שהם קיימים בכיתה

6. א סטָטִי מעמד

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

ארכיטקטורת הכיתות המקוננת מחולקת לשניים:

  • שיעורים מקוננים המוצהרים סטָטִי נקראים סטָטִי שיעורים מקוננים ואילו,
  • שיעורים מקוננים שאינםסטָטִי נקראים שיעורים פנימיים

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

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

6.1. דוגמא של סטָטִי מעמד

הגישה הנפוצה ביותר ליצירת אובייקטים של יחידים היא דרך סטָטִי הכיתה המקוננת היא שאינה מצריכה שום סנכרון וקל ללמוד וליישם:

מחלקה ציבורית Singleton {Private Singleton () {} class static private SingletonHolder {מופע סופי ציבורי סטטי סינגלטון = Singleton חדש (); } סינגלטון סטטי ציבורי getInstance () {return SingletonHolder.instance; }}

6.2. סיבות משכנעות לשימוש א סטָטִי כיתה פנימית

  • שיעורי קיבוץ שישמשו רק במקום אחד מגדילים את האקפסולציה
  • הקוד מתקרב למקום שיהיה רק ​​אחד שישתמש בו; זה מגביר את הקריאות והקוד מתחזק יותר
  • אם המחלקה המקוננת אינה מצריכה גישה אליה, היא מצפה את חברי מופע הכיתה, עדיף להכריז עליה ככאלה סטָטִי מכיוון שכך, זה לא יהיה מחובר למחלקה החיצונית ולכן יהיה אופטימלי יותר מכיוון שהם לא ידרשו שום זיכרון ערימה או מחסנית

6.3. נקודות מפתח שיש לזכור

  • סטָטִי לכיתות מקוננות אין גישה לשני חברי המעמד החיצוני הסוגר; זה יכול לגשת אליהם רק דרך הפניה של אובייקט
  • כיתות מקוננות סטטיות יכולות לגשת לכל החברים הסטטיים של הכיתה הסוגרת, כולל פרטיים
  • מפרט התכנות של Java אינו מאפשר לנו להכריז על הכיתה ברמה העליונה כ- סטָטִי; רק שיעורים בתוך השיעורים (שיעורים מקוננים) יכולים להיעשות כ- סטָטִי

7. מסקנה

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

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