0Pricing
Java Academy · درس

أنماط Record المتداخلة

مطابقة البيانات المتداخلة بعمق

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

أنماط السجلات المتداخلة

يمكن أن تتداخل أنماط السجلات: فإذا كان أحد المكوّنات سجلًا بحد ذاته، فيمكن فك بنيته داخل النمط الخارجي. ويتيح ذلك مطابقة البيانات ذات البنية العميقة في تعبير واحد.

نموذج بيانات متداخل

لنفترض وجود Line مكوّن من سجلَّي Point. فالسجلان الداخليان مرشحان طبيعيان للتداخل.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Line line = new Line(new Point(0, 0), new Point(3, 4));
        System.out.println(line);
    }
}

فك البنية على مستوى واحد

يسند النمط المسطح مكوّنَي Point، لكنه يترك كلًا منهما كاملًا.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point s, Point e)) {
            System.out.println(s + " -> " + e);
        }
    }
}

التعمق أكثر

استبدلوا Point s الداخلي بنمط السجل الخاص به للوصول إلى الإحداثيات مباشرةً: Line(Point(int x1, int y1), Point(int x2, int y2)).

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    public static void main(String[] args) {
        Object obj = new Line(new Point(0, 0), new Point(3, 4));
        if (obj instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            double len = Math.hypot(x2 - x1, y2 - y1);
            System.out.println("Length: " + len);
        }
    }
}

أي عمق

يمكن أن يصل التداخل إلى العمق الذي تفرضه بياناتكم. ففي كل مستوى، إما أن يسند مكوّنًا كاملًا أو يفك بنيته أكثر، محاكيًا شكل البنية بدقة.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}
    record Drawing(Line first, String label) {}

    public static void main(String[] args) {
        Object obj = new Drawing(new Line(new Point(1, 2), new Point(3, 4)), "diag");
        if (obj instanceof Drawing(Line(Point(var ax, var ay), var end), var label)) {
            System.out.println(label + " starts at " + ax + "," + ay);
            System.out.println("ends near " + end);
        }
    }
}

الدمج بين var والأنواع

يمكنكم داخل النمط المتداخل الدمج بحرية بين الأنواع الصريحة وvar. استخدموا var للمكوّنات التي تمررونها فقط، واستخدموا الأنواع الصريحة حيث تكون الوضوح مهمًا.

التداخل في switch

تكون الأنماط المتداخلة معبّرة بشكل خاص في switch، إذ تتيح لكل حالة وصف شكل دقيق للبيانات.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static String describe(Object o) {
        return switch (o) {
            case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
            case Line(Point p1, Point p2) -> "general line";
            default -> "not a line";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Line(new Point(2, 0), new Point(2, 9))));
        System.out.println(describe(new Line(new Point(0, 0), new Point(5, 5))));
    }
}

يجب أن تنجح المطابقة كاملةً

لا ينجح النمط المتداخل إلا إذا تطابقت كل المستويات. فإذا كان أي مكوّن من نوع مختلف عما يتوقعه نمطه الفرعي، تفشل المطابقة الكلية ولا يتم إسناد أي متغيرات.

موازنة قابلية القراءة

يُعد التداخل العميق قويًا، لكنه قد يصعب قراءته. فإذا أصبح النمط كبيرًا جدًا، فكروا في فك البنية على مستوى واحد ومعالجة الباقي بمنطق منفصل.

الحواجز فوق الإسنادات المتداخلة

بما أن الأنماط المتداخلة تكشف القيم الداخلية كمتغيرات محلية، يمكن لحارس when واحد الإشارة إلى حقول من عدة مستويات في آن واحد.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static boolean isUnitStep(Object o) {
        return o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))
            && x2 - x1 == 1 && y2 - y1 == 1;
    }

    public static void main(String[] args) {
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(1, 1))));
        System.out.println(isUnitStep(new Line(new Point(0, 0), new Point(2, 2))));
    }
}

مثال كامل

احسبوا نقطة منتصف الخط عبر فك بنية طرفيه.

public class Main {
    record Point(int x, int y) {}
    record Line(Point start, Point end) {}

    static Point midpoint(Object o) {
        if (o instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            return new Point((x1 + x2) / 2, (y1 + y2) / 2);
        }
        return null;
    }

    public static void main(String[] args) {
        System.out.println(midpoint(new Line(new Point(0, 0), new Point(4, 6))));
    }
}

اختبار سريع

اختبروا مدى فهمكم لأنماط السجلات المتداخلة.

مراجعة

لقد تعلمتم أنماط السجلات المتداخلة.

  • يمكن فك بنية مكوّن سجل هو نفسه سجل مباشرةً داخل النمط.
  • يمكن أن يصل التداخل إلى أي عمق، مع الدمج بين الأنواع الصريحة وvar.
  • لا تنجح المطابقة إلا إذا تطابق كل مستوى.
  • يمكن استخدام الإسنادات الداخلية في الحواجز وفي جسم الحالة معًا.

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

هل درس «أنماط Record المتداخلة» مجاني؟

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

ماذا ستتعلم في «أنماط Record المتداخلة»؟

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

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

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

كم من الوقت يستغرق درس «أنماط Record المتداخلة»؟

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

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

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

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

  1. مطابقة الأنماط مع instanceof
  2. أنماط Record
  3. أنماط Record المتداخلة
  4. الأنماط في switch
← العودة إلى Java Academy