Java Academy · درس

التصريح بالأنواع المختومة

تقييد الأنواع التي يمكنها توسيع نوع ما

الدرس 1 من 413 خطوة

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

ما المقصود بالأنواع sealed

تقيّد الفئة أو الواجهة sealed الأنواع الأخرى التي يمكنها توسيعها أو تنفيذها. ويتيح لك ذلك نمذجة مجموعة مغلقة من الاحتمالات يمكن للمصرّف الاستدلال عليها.

المشكلة التي يحلّها

يمكن لأي جهة وفي أي مكان إنشاء فئة فرعية من فئة public عادية. لكنك قد تريد أحيانًا ثلاثة أشكال بالضبط أو نوعين من المدفوعات، دون أي مفاجآت. يجعل sealing هذه النية واضحةً ويفرضها.

الكلمة المفتاحية sealed

حدّد النوع باستخدام sealed، ثم اذكر الأنواع الفرعية المسموح بها باستخدام permits. ويجب على كل نوع فرعي مسموح به أن يعلن مُعدّل التوريث الخاص به.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    public static void main(String[] args) {
        Shape s = new Circle(2.0);
        System.out.println(s);
    }
}

مُعدّلات الأنواع الفرعية

يجب أن يكون كل نوع فرعي مسموح به واحدًا من الآتي: final (لا يسمح بمزيد من التوريث)، أو sealed (يواصل التقييد)، أو non-sealed (يعيد فتحه للتوسيع بحرية). وتكون Records ضمنيًا final.

فئة فرعية من النوع final

يؤدي تحديد فئة فرعية باستخدام final إلى إغلاق التسلسل الهرمي عند ذلك الفرع.

public class Main {
    sealed interface Animal permits Dog, Cat {}
    static final class Dog implements Animal {
        public String toString() { return "Dog"; }
    }
    static final class Cat implements Animal {
        public String toString() { return "Cat"; }
    }

    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a);
    }
}

فئة فرعية من النوع non-sealed

يعيد النوع الفرعي non-sealed فتح التوسيع عمدًا، مما يسمح للفئات غير المعروفة بتوسيعه مجددًا. استخدمه باعتدال عندما يلزم إبقاء أحد الفروع مفتوحًا.

public class Main {
    sealed interface Plugin permits CorePlugin, ExternalPlugin {}
    static final class CorePlugin implements Plugin {}
    static non-sealed class ExternalPlugin implements Plugin {}
    static class ThirdParty extends ExternalPlugin {}

    public static void main(String[] args) {
        Plugin p = new ThirdParty();
        System.out.println(p.getClass().getSimpleName());
    }
}

الفئات sealed أيضًا

لا يقتصر sealing على الواجهات. إذ تعمل sealed class المجرّدة بالطريقة نفسها، ويمكنها الاحتفاظ بالحالة والسلوك المشتركين.

public class Main {
    sealed static abstract class Expr permits Num, Add {}
    static final class Num extends Expr {
        final int value;
        Num(int value) { this.value = value; }
    }
    static final class Add extends Expr {
        final Expr left, right;
        Add(Expr left, Expr right) { this.left = left; this.right = right; }
    }

    public static void main(String[] args) {
        Expr e = new Add(new Num(1), new Num(2));
        System.out.println(e.getClass().getSimpleName());
    }
}

الوحدة أو الحزمة نفسها

يجب أن تكون الأنواع الفرعية المسموح بها في الوحدة نفسها التي يوجد فيها النوع sealed، أو في الحزمة نفسها إذا لم يكن الكود معياريًا. ويحافظ ذلك على المجموعة المغلقة مجتمعةً وقابلةً للتحقق.

فرض المصرّف

إذا حاولت فئة توسيع نوع sealed من دون إدراجها في permits، فلن يُصرَّف الكود. وتكون المجموعة المغلقة مضمونةً في وقت التصريف.

أهمية ذلك

بما أن المصرّف يعرف كل الأنواع الفرعية، فيمكنه التحقق من أن switch على النوع sealed يعالج جميع الحالات. وهذا هو الأساس لمطابقة الأنماط الشاملة، التي ستتناولها دورة لاحقة.

تسلسل هرمي مكتمل

إليك تسلسلًا هرميًا صغيرًا ومغلقًا يُستخدم لنمذجة القيم.

public class Main {
    sealed interface Json permits JsonNull, JsonNumber, JsonString {}
    record JsonNull() implements Json {}
    record JsonNumber(double value) implements Json {}
    record JsonString(String value) implements Json {}

    public static void main(String[] args) {
        Json[] values = { new JsonNull(), new JsonNumber(3.5), new JsonString("hi") };
        for (Json j : values) {
            System.out.println(j);
        }
    }
}

تحقق سريع

اختبر مدى فهمك للتعريفات sealed.

مراجعة

تعلّمت كيفية تعريف الأنواع sealed.

  • يقيّد sealed الجهات التي يمكنها توسيع النوع أو تنفيذه.
  • يسرد بند permits الأنواع الفرعية المسموح بها.
  • يجب أن يكون كل نوع فرعي final أو sealed أو non-sealed.
  • توجد الأنواع الفرعية في الوحدة أو الحزمة نفسها، ويفرض المصرّف هذه القواعد.
البدء مجانًا

تعلم Java مع معلم ذكاء اصطناعي — مجانًا

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

الدورات
104
الدروس
374

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

هل درس «التصريح بالأنواع المختومة» مجاني؟

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

ماذا ستتعلم في «التصريح بالأنواع المختومة»؟

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

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

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

كم من الوقت يستغرق درس «التصريح بالأنواع المختومة»؟

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

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

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

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

  1. التصريح بالأنواع المختومة
  2. جملة permits
  3. الأنواع المختومة مع Records
  4. التبديل الشامل على نوع مختوم
← العودة إلى Java Academy