0Pricing
Java Academy · درس

EnumSet

عمليات مجموعات سريعة على Enums

EnumSet درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ما هو EnumSet؟

إن EnumSet تنفيذ متخصص للواجهة Set مخصص لأنواع التعدادات فقط.

وهو داخليًا متجه بتات؛ إذ يُربط كل ثابت ببت واحد. وهذا يجعله سريعًا للغاية وفعّالًا في استهلاك الذاكرة مقارنةً بـ HashSet من التعدادات.

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
        System.out.println(weekend);
    }
}

الإنشاء باستخدام of

تنشئ الدالة المصنعية EnumSet.of(...) مجموعة من الثوابت المدرجة. وتتوفر نسخ محمّلة لعنصر واحد حتى خمسة عناصر، بالإضافة إلى نسخة varargs.

import java.util.EnumSet;

public class Main {
    enum Perm { READ, WRITE, EXECUTE }
    public static void main(String[] args) {
        EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
        System.out.println(perms);
    }
}

allOf و noneOf

توجد دالتان مصنعيّتان إضافيتان:

  • تنشئ allOf(Type.class) مجموعة تحتوي على كل الثوابت.
  • تنشئ noneOf(Type.class) مجموعة فارغة جاهزة للملء.
import java.util.EnumSet;

public class Main {
    enum Color { RED, GREEN, BLUE }
    public static void main(String[] args) {
        EnumSet<Color> all = EnumSet.allOf(Color.class);
        EnumSet<Color> none = EnumSet.noneOf(Color.class);
        none.add(Color.RED);
        System.out.println("all: " + all);
        System.out.println("built: " + none);
    }
}

range للثوابت المتجاورة

تضم EnumSet.range(from, to) جميع الثوابت الواقعة بين نقطتي البداية والنهاية، شاملًا الطرفين، وبترتيب التصريح.

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
        System.out.println(workdays);
    }
}

complementOf

تعيد EnumSet.complementOf(set) مجموعة تحتوي على جميع الثوابت غير الموجودة في المجموعة المعطاة.

وهذه طريقة سريعة لعكس الاختيار.

import java.util.EnumSet;

public class Main {
    enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
    public static void main(String[] args) {
        EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
        EnumSet<Day> rest = EnumSet.complementOf(work);
        System.out.println(rest);
    }
}

عمليات المجموعات

بما أن EnumSet مجموعة Set حقيقية، تحصلون على عمليات الاتحاد والتقاطع والفرق عبر addAll وretainAll وremoveAll.

وتُنفَّذ هذه العمليات داخليًا بسرعة عمليات البتات نفسها.

import java.util.EnumSet;

public class Main {
    enum Tag { A, B, C, D }
    public static void main(String[] args) {
        EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
        EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
        EnumSet<Tag> inter = EnumSet.copyOf(x);
        inter.retainAll(y);
        System.out.println("intersection: " + inter);
    }
}

اختبارات الانتماء

إن contains ليس سوى فحص لبت واحد، ولذلك يعمل في زمن ثابت وبسرعة كبيرة.

import java.util.EnumSet;

public class Main {
    enum Feature { DARK_MODE, BETA, ANALYTICS }
    public static void main(String[] args) {
        EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
        System.out.println(enabled.contains(Feature.BETA));
        System.out.println(enabled.contains(Feature.ANALYTICS));
    }
}

EnumSet بديلًا عن الرايات

قبل ظهور EnumSet، كان المبرمجون يستخدمون رايات بتات من نوع int مثل READ | WRITE. ويستبدل EnumSet ذلك بأمان الأنواع ووضوح القراءة.

تحصلون على أداء حقول البتات من دون عمليات إخفاء يدوية كثيرة الأخطاء.

import java.util.EnumSet;
import java.util.Set;

public class Main {
    enum Style { BOLD, ITALIC, UNDERLINE }
    static void render(Set<Style> styles) {
        System.out.println("Applying: " + styles);
    }
    public static void main(String[] args) {
        render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
    }
}

التكرار بترتيب التصريح

يكرّر EnumSet العناصر وفق الترتيب الطبيعي للثوابت، أي ترتيب التصريح عنها.

وهذا يمنحكم تكرارًا متوقعًا ومستقرًا، بخلاف HashSet.

import java.util.EnumSet;

public class Main {
    enum Phase { ALPHA, BETA, RC, GA }
    public static void main(String[] args) {
        EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
        for (Phase p : set) System.out.println(p);
    }
}

النسخ الوقائية باستخدام copyOf

تنشئ EnumSet.copyOf(collection) كائن EnumSet من أي مجموعة تحتوي على قيم تعداد. استخدموها لإنشاء نسخة آمنة أو لتحويل List.

import java.util.EnumSet;
import java.util.List;

public class Main {
    enum Role { ADMIN, EDITOR, VIEWER }
    public static void main(String[] args) {
        List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
        EnumSet<Role> roles = EnumSet.copyOf(source);
        System.out.println(roles);
    }
}

سبب سرعته

بالنسبة إلى التعدادات التي تحتوي على 64 ثابتًا أو أقل، يستخدم EnumSet قيمة long واحدة كمتجه بتات. وتحتاج كل عملية إلى تعليمة أو تعليمتين من تعليمات الآلة.

استخدموا دائمًا EnumSet بدلًا من HashSet<MyEnum> عند إنشاء مجموعات من التعدادات.

import java.util.EnumSet;

public class Main {
    enum Bit { B0, B1, B2, B3 }
    public static void main(String[] args) {
        EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
        // contains is a single bit-and under the hood
        System.out.println(s.contains(Bit.B2));
    }
}

تحقق سريع

اختبروا معرفتكم بـ EnumSet.

مراجعة

تعلّمتم EnumSet:

  • واجهة Set تعتمد على متجه بتات للتعدادات، وهي سريعة جدًا ومضغوطة.
  • الدوال المصنعية: of وallOf وnoneOf وrange وcomplementOf وcopyOf.
  • يكرّر العناصر بترتيب التصريح.
  • بديل آمن للأنواع عن رايات البتات من نوع int.

التالي هو نوع الخريطة المطابق: EnumMap.

import java.util.EnumSet;

public class Main {
    enum X { A, B }
    public static void main(String[] args) {
        System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
    }
}

الأسئلة الشائعة

هل درس «EnumSet» مجاني؟

نعم — نص درس «EnumSet» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «EnumSet»؟

عمليات مجموعات سريعة على Enums تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «EnumSet»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Enums مع الحقول والدوال
  2. الدوال المجرّدة في Enums
  3. EnumSet
  4. EnumMap
← العودة إلى Java Academy