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

שיעור 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 ימים אמיתיים בשבוע, ולכל אחד מהם יש שם ספציפי. לכן, המשימה שלנו היא להגביל איכשהו את טווח הערכים האפשריים עבור הכיתה DayOfWeek . לפני ש-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 + '\'' +
               '}';
   }
}
הנה מה שאתה צריך לשים לב:
  • הקונסטרוקטור הוא פרטי. אם בנאי מסומן עם השינוי הפרטי , לא ניתן להשתמש בו כדי ליצור אובייקט. ומכיוון שלמחלקה יש רק בנאי אחד, אי אפשר ליצור אובייקטים של DayOfWeek .

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }

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

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

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

    תְפוּקָה:

    DayOfWeek{title = 'יום ראשון'}

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

אז מה זה Java Enum?

בואו נחזור על הדוגמה שלנו ל-DayOfWeek :
public enum DayOfWeek {

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

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

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

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
בשיטת wakeUp() אנו משתמשים ב-Java Enum כדי לקבוע מה התלמיד צריך לעשות לאחר מכן. אפילו לא סיפקנו פרטים על כל תחום ב- DayOfWeek , ואנחנו לא צריכים: זה ברור איך ימות השבוע אמורים לעבוד. אם נשתמש בו בצורתו הנוכחית, כל מפתח יבין מה קורה בקוד שלנו. דוגמה נוספת לנוחות של Enum היא שניתן להשתמש בקבועים שלה עם הצהרת switch. לדוגמה, בואו נכתוב תוכנית לדיאטה קפדנית, שבה מנות מתוזמנות לפי היום:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
זהו אחד היתרונות של Enums על פני הפתרון הישן ששימש לפני Java 1.5 - לא ניתן היה להשתמש בפתרון הישן עם מתג . מה עוד אתה צריך לדעת על 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 שלנו יש שדה כותרת , getter ושיטת 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 = 'יום ראשון'}

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