Menu
Coddy logo textTech

Enums ומתודות של Enum

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 50 מתוך 87.

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

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.MONDAY;
System.out.println(today);  // מדפיס: MONDAY

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

enum Size {
    SMALL(10), MEDIUM(20), LARGE(30);
    
    private int price;
    
    Size(int price) {
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
}

System.out.println(Size.MEDIUM.getPrice());  // מדפיס: 20

כל enum מגיע עם מתודות שימושיות מובנות. המתודה values() מחזירה מערך של כל הקבועים, ואילו valueOf() ממירה מחרוזת לקבוע enum תואם. המתודה ordinal() מחזירה את המיקום של הקבוע (החל מ־0):

for (Day d : Day.values()) {
    System.out.println(d + " is at position " + d.ordinal());
}

Day day = Day.valueOf("FRIDAY");  // ממיר מחרוזת לערך enum

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

challenge icon

אתגר

קל

בואו נבנה מערכת הזמנות לבית קפה שמדגימה את העוצמה של enums עם שדות, בנאים ומתודות. תיצרו enum בשם CoffeeSize ששומר מידע על מחירים, וכן מערכת לעיבוד הזמנות של לקוחות.

תארגנו את הקוד בשלושה קבצים:

  • CoffeeSize.java: צרו enum שמייצג גדלים של קפה עם המחירים המתאימים. ה-enum שלכם צריך להכיל שלושה קבועים: SMALL, MEDIUM ו-LARGE, עם המחירים 2.50, 3.50 ו-4.50 בהתאמה.

    לכל גודל צריך להיות שדה price פרטי (double), בנאי שיקבע את ערכו, ומתודה getPrice() לאחזור שלו. הוסיפו גם מתודה getDescription() שמחזירה מחרוזת בפורמט: [size name] - $[price] (לדוגמה: SMALL - $2.5)

  • Order.java: צרו מחלקה שמייצגת הזמנת קפה. ל-Order יש שני שדות פרטיים: customerName (String) ו-size (CoffeeSize). הוסיפו בנאי לאתחול שני השדות ומתודות getter לכל אחד מהם.

    הוסיפו מתודה getReceipt() שמחזירה מחרוזת מרובת שורות:

    Order for: [customerName]
    Size: [size description from getDescription()]
    Total: $[price from the size]
  • Main.java: הפיחו חיים בבית הקפה שלכם! יתקבלו שני קלטים: שם של לקוח (String) ושם של גודל (String כמו "SMALL", "MEDIUM", או "LARGE").

    תחילה, השתמשו ב-CoffeeSize.valueOf() כדי להמיר את מחרוזת הגודל לקבוע enum המתאים. צרו Order עם שם הלקוח והגודל, ואז הדפיסו את הקבלה.

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

יתקבלו שני קלטים לפי הסדר: שם הלקוח ושם הגודל (אחד מ-"SMALL", "MEDIUM", או "LARGE").

שימו לב איך ה-enum מאגד גם את זהות הגודל וגם את המחיר המתאים לו — פתרון נקי הרבה יותר משימוש בקבועים נפרדים או במספרי קסם לאורך הקוד שלכם!

נסו בעצמכם

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // קראו את נתוני הקלט
        String customerName = scanner.nextLine();
        String sizeName = scanner.nextLine();
        
        // TODO: המירו את sizeName לערך מה-enum CoffeeSize באמצעות valueOf()
        
        // TODO: צרו Order עם שם הלקוח והגודל
        
        // TODO: הדפיסו את הקבלה
        
        // TODO: הדפיסו שורה ריקה
        
        // TODO: הציגו את התפריט המלא באמצעות מעבר על כל הערכים של CoffeeSize
        // רמז: השתמשו ב-CoffeeSize.values() כדי לקבל את כל הקבועים של ה-enum
        
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין