CodeGym /בלוג Java /Random-HE /10 דברים שאתה צריך לדעת על השינוי הסטטי ב-Java
John Squirrels
רָמָה
San Francisco

10 דברים שאתה צריך לדעת על השינוי הסטטי ב-Java

פורסם בקבוצה
ב-Java, השינוי הסטטי אומר שמשהו קשור ישירות למחלקה: אם שדה הוא סטטי, אז הוא שייך למחלקה; אם מתודה היא סטטית, אז היא שייכת למחלקה. כתוצאה מכך, אתה יכול להשתמש בשם המחלקה כדי לקרוא למתודה סטטית או להפנות לשדה סטטי. לדוגמה, אם countהשדה סטטי במחלקה Counter, זה אומר שאתה יכול להתייחס למשתנה באמצעות הביטוי הבא: Counter.count. 10 דברים שאתה צריך לדעת על השינוי הסטטי ב-Java - 1כמובן, יש לשקול משנה גישה. לדוגמה, privateשדות זמינים רק בתוך המחלקה שבה הם מוצהרים. ושדות protectedזמינים לכל המחלקות בתוך חבילה, כמו גם לכל תת המחלקות שלהם מחוץ לחבילה. נניח שלמחלקה Counterיש שיטה סטטית increment()שתפקידה להגדיל את countהשדה. כדי לקרוא לשיטה זו, אתה יכול להשתמש Counter.increment(). אין צורך ליצור מופע של המחלקה Counterכדי לגשת לשדה או שיטה סטטית. זהו ההבדל המהותי בין משתנים ושיטות סטטיים (מחלקה) לבין משתנים ומתודות שאינם סטטיים (מופע). הערה חשובה. אל תשכח שהחברים הסטטיים של המחלקה שייכים ישירות למחלקה, לא כל מופע של המחלקה. כלומר, הערך של countהמשתנה הסטטי יהיה זהה עבור כל Counterהאובייקטים. במאמר זה, נסקור את ההיבטים הבסיסיים של השימוש בשינוי הסטטי ב-Java, כמו גם כמה תכונות שיעזרו לך להבין מושגי תכנות מרכזיים.

מה שכל מתכנת צריך לדעת על השינוי הסטטי בג'אווה.

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

    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }

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

  2. בניגוד למשתנים מקומיים, שדות ושיטות סטטיים אינם thread safeב-Java. בפועל, זהו אחד הגורמים השכיחים ביותר לבעיות אבטחה בתכנות מרובה הליכי. בהתחשב בכך שכל מופע של מחלקה מתייחס לאותו עותק של משתנה סטטי, משתנה כזה צריך להיות מוגן או "נעול" על ידי המחלקה. לכן, בעת שימוש במשתנים סטטיים, ודא שהם תקינים synchronizedכדי למנוע בעיות כגון race conditions.

  3. לשיטות סטטיות יתרון מעשי בכך שאין צורך ליצור אובייקט חדש בכל פעם שרוצים לקרוא להם. ניתן לקרוא למתודה סטטית באמצעות שם המחלקה שמצהירה עליה. לכן השיטות הללו מושלמות לשיטות factoryושיטות utility. המחלקה java.lang.Mathהיא דוגמה נפלאה: כמעט כל השיטות שלה הן סטטיות. מחלקות השירות של Java מסומנות finalמאותה סיבה.

  4. נקודה חשובה נוספת היא שאינך יכול לעקוף ( @Override) שיטות סטטיות. אם אתה מצהיר על שיטה כזו ב- subclass, כלומר שיטה עם אותו שם וחתימה, אתה פשוט "מסתיר" את השיטה של ​​ה- superclassבמקום לעקוף אותה. תופעה זו ידועה בשם method hiding. המשמעות היא שאם מוצהרת שיטה סטטית גם בכיתות האב וגם בכיתות הילד, השיטה שנקראת תהיה תמיד מבוססת על סוג המשתנה בזמן ההידור. בניגוד לעקוף שיטה, שיטות כאלה לא יבוצעו כאשר התוכנית פועלת. הבה נשקול דוגמה:

    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         }
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         }
    }
    
    public class Demo {
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }

    פלט מסוף:

    בתוך מחלקת האב / שיטה סטטית

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

  5. יתרה מכך, מלבד מחלקות ברמה העליונה, אתה יכול להכריז על מחלקות סטטיות. שיעורים כאלה ידועים בשם nested static classes. הם שימושיים למתן לכידות טובה יותר. דוגמה בולטת למחלקה סטטית מקוננת היא HashMap.Entry, שהיא מבנה נתונים בפנים HashMap. ראוי לציין שכמו מחלקות פנימיות, מחלקות מקוננות סטטיות מוצהרות בקובץ .class נפרד. לפיכך, אם תכריז על חמש מחלקות מקוננות במחלקה הראשית שלך, יהיו לך 6 קבצים עם סיומת .class. דוגמה נוספת היא ההכרזה משלנו Comparator, כגון משווה גיל ( AgeComparator) בכיתה Employee.

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

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

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

  9. במהלך סדרה, שדות סטטיים, כמו transientמשתנים, אינם מסודרים. ואכן, אם תשמור נתונים בשדה סטטי, הוא יכיל את הערך הראשוני (ברירת המחדל) שלו לאחר דה-סריאליזציה. לדוגמה, אם שדה סטטי הוא int, הערך שלו יהיה אפס לאחר דה-סריאליזציה. אם הסוג שלו הוא float, הערך יהיה 0.0. אם השדה הוא Object, הערך יהיה null. למען האמת, זו אחת השאלות הנפוצות ביותר לגבי סדרה בראיונות לתפקידי Java. אל תאחסן נתוני אובייקט חיוניים בשדה סטטי!

  10. לבסוף, בואו נדבר על יבוא סטטי. לשינוי זה יש הרבה מן המשותף להצהרה הסטנדרטית import, אך הוא שונה בכך שהוא מאפשר לייבא אחד או את כל חברי המחלקה הסטטית. לאחר מיובאים של שיטות סטטיות, ניתן לגשת אליהן כאילו הוכרזו באותה מחלקה. באופן דומה, על ידי ייבוא ​​שדות סטטיים, נוכל לגשת אליהם מבלי לציין את שם המחלקה. תכונה זו הופיעה ב-Java 1.5 ומשפרת את קריאת הקוד בשימוש נכון. מבנה זה נמצא לרוב בבדיקות JUnit, מכיוון שכמעט כל מפתחי הבדיקות משתמשים בייבוא ​​סטטי עבור שיטות טענה, למשל assertEquals()והגרסאות העמוסות שלהם.

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

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION