Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الـ Enums ودوالها

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 50 من 87.

إن enum (التعداد) هو نوع خاص من class يمثّل مجموعة ثابتة من constants. وبدلاً من استخدام أعداد صحيحة أو سلاسل نصية عشوائية لتمثيل خيارات مثل أيام الأسبوع أو حالات الطلب، توفّر التعدادات قيماً آمنة من حيث النوع وسهلة القراءة.

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

Day today = Day.MONDAY;
System.out.println(today);  // يطبع: MONDAY

التعدادات أكثر من مجرد constants بسيطة: إنها class كاملة. يمكنك إضافة fields وconstructor وmethods إليها:

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 مع methods مضمّنة مفيدة. تُرجع method values() مصفوفة تضم جميع constants، بينما تحوّل method valueOf() سلسلة نصية إلى enum المطابق. تُرجع method ordinal() موضع الثابت (بدءًا من 0):

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

Day day = Day.valueOf("FRIDAY");  // يحوّل السلسلة النصية إلى enum

تُعدّ التعدادات مثالية عندما تكون لديك مجموعة معروفة وثابتة من القيم التي لن تتغير أثناء وقت التشغيل، مما يجعل شفرتك أكثر أمانًا وتعبيرًا من استخدام constants العادية.

challenge icon

التحدي

سهل

لننشئ نظامًا لطلب القهوة في مقهى يوضّح قوة التعدادات مع الحقول والمنشئات والطرائق. ستنشئ تعدادًا باسم CoffeeSize يخزّن معلومات الأسعار ونظامًا لمعالجة طلبات العملاء.

ستنظّم شفرتك عبر ثلاثة ملفات:

  • CoffeeSize.java: أنشئ تعدادًا يمثّل أحجام القهوة مع الأسعار المرتبطة بها. يجب أن يحتوي التعداد على ثلاثة ثوابت: 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() لتحويل سلسلة الحجم إلى ثابت التعداد المطابق. أنشئ Order باستخدام اسم العميل والحجم، ثم اطبع الإيصال.

    بعد طباعة الإيصال، اطبع سطرًا فارغًا، ثم اعرض القائمة الكاملة من خلال التكرار عبر جميع قيم CoffeeSize باستخدام طريقة values(). ولكل حجم، اطبع وصفه في سطر منفصل.

ستتلقى مدخلين بالترتيب: اسم العميل واسم الحجم (أحد "SMALL" أو "MEDIUM" أو "LARGE").

لاحظ كيف يغلّف التعداد كلًا من هوية الحجم وسعره المرتبط به، بطريقة أنظف بكثير من استخدام ثوابت منفصلة أو أرقام سحرية في أنحاء شفرتك!

جرّب بنفسك

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
        // Hint: استخدم CoffeeSize.values() للحصول على جميع ثوابت enum
        
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت