JavaRush /בלוג Java /Random-HE /Enum ב-Java: כיצד להשתמש בכיתה

Enum ב-Java: כיצד להשתמש בכיתה

פורסם בקבוצה
שלום! במאמר זה אספר לכם על Java Enums. תאר לעצמך שקיבלת משימה: צור כיתה המיישמת את ימי השבוע . במבט ראשון, אין בזה שום דבר מסובך, והקוד שלך ייראה בערך כך:
public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
ונראה שהכל בסדר, אבל יש בעיה אחת: אתה יכול להעביר כל טקסט לבנאי של הכיתה DayOfWeek . בדרך זו, מישהו יכול ליצור את היום בשבוע "צפרדע", "ענן" או "azaza322". ברור שזו לא ההתנהגות שאנו מצפים לה, כי יש רק 7 ימים אמיתיים בשבוע, ולכל אחד מהם יש שם. לכן, המשימה שלנו היא איכשהו להגביל את טווח הערכים האפשריים לשיעור " יום בשבוע ". לפני Java 1.5, מפתחים נאלצו להמציא פתרון לבעיה זו בעצמם, מכיוון שלא היה פתרון מוכן בשפה עצמה. באותם ימים, אם המצב דרש מספר מוגבל של ערכים, הם עשו כך:
public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
למה כדאי לשים לב כאן:
  • בנאי פרטי. אם בנאי מסומן ב- private modifier , לא ניתן ליצור אובייקט של המחלקה באמצעות הבנאי הזה. ומכיוון שיש רק בנאי אחד במחלקה הזו, לא ניתן ליצור את האובייקט DayOfWeek כלל.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • יחד עם זאת, המחלקה הכילה את המספר הנדרש של אובייקטים סטטיים פומביים שאותחו בצורה שהיינו צריכים (שמות הימים נכונים).

    זה איפשר להשתמש באובייקטים במחלקות אחרות.

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    סיכום:

    DayOfWeek{title='Sunday'}

גישה זו אפשרה לנו במידה רבה לפתור את הבעיה. עמדו לרשותנו 7 ימים בשבוע, ואף אחד לא יכול היה ליצור חדשים. פתרון זה הוצע על ידי יהושע בלוך בספר ג'אווה יעילה . הספר, אגב, מאוד מגניב וחובה לקרוא לכל מפתח ג'אווה.
כיצד להשתמש במחלקה Enum - 2
עם שחרורו של Java 1.5, השפה הציגה פתרון מוכן למצבים כאלה - ה- Enumeration . Enum הוא גם כיתה. אבל הוא "מותאם" במיוחד כדי לפתור בעיות דומות לשלנו: יצירת טווח מוגבל מסוים של ערכים. מכיוון שליוצרי ג'אווה כבר היו דוגמאות מוכנות (נניח, שפת C, שבה כבר קיים Enum ), הם הצליחו ליצור את האפשרות האופטימלית.

מה זה enum?

אז מה זה Enum ב-Java ? בואו נסתכל על הדוגמה של אותו DayOfWeek :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
זה כבר נראה הרבה יותר פשוט :) בתוך ה-Enum שלנו יש 7 קבועים עם גישה סטטית. אנחנו כבר יכולים להשתמש בו כדי ליישם לוגיקה בתוכנית. למשל, בואו נכתוב תוכנית שתקבע אם תלמיד צריך ללכת לבית הספר היום. לתלמיד שלנו תהיה שגרת יומיומית משלו, המיועדת על ידי כיתת ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
המשתנה dayOfWeek במצב יום קובע באיזה יום מדובר. והנה הכיתה של התלמיד שלנו:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
בשיטת wakeUp() , באמצעות Enum, אנו קובעים את הפעולות הנוספות של התלמיד. אפילו לא תיארנו בפירוט מה המשמעות של כל משתנה ב- DayOfWeek , וזה לא הכרחי: המנגנון של ימי השבוע כבר ברור, ואם נשתמש בו בצורתו הנוכחית, כל מפתח יבין מה קורה בקוד שלך. דוגמה נוספת לנוחות של Enum היא שניתן להשתמש בקבועים שלו עם הצהרת switch . לדוגמה, אנו כותבים תוכנית לדיאטה קפדנית, שבה הארוחות נקבעות לפי יום:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
זהו אחד היתרונות של Enum על פני הפתרון הישן שהיה בשימוש לפני Java 1.5: לא ניתן היה להשתמש בפתרון הישן עם switch .

מה עוד אתה צריך לדעת על שיעור Enum?

מחלקה Enum היא מחלקה אמיתית עם כל היכולות הנלוות אליה. לדוגמה, אם ההטמעה הנוכחית של ימי השבוע אינה מספיקה לך, תוכל להוסיף משתנים, בנאים ושיטות ל- DayOfWeek :
public enum DayOfWeek {

   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
לקבועים של Enum שלנו יש כעת שדה כותרת , מגטר ושיטת toString שנדחתה . בהשוואה לשיעורים רגילים, ל-Enum יש מגבלה רצינית אחת - לא ניתן לרשת ממנה. בנוסף, לספירות יש שיטות ייחודיות להן:
  • values() : מחזירה מערך של כל הערכים המאוחסנים ב- Enum :

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    סיכום:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'שישי'}, DayOfWeek{title='שבת'}]

  • ordinal() : מחזירה את המספר הסידורי של קבוע. הספירה לאחור מתחילה מאפס:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    סיכום:

    0

  • valueOf() : מחזירה אובייקט Enum המתאים לשם הנתון:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    סיכום:

    DayOfWeek{title='Sunday'}

שים לב:אנו משתמשים באותיות רישיות בשמות של רכיבי Enum מכיוון שהם קבועים ומסומנים כקבועים, לא camelCase .
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION