الأنواع المختومة مع Records
نمذجة التراتبيات المغلقة
الأنواع المختومة مع Records درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
الأنواع sealed مع السجلات
تشكّل الواجهات sealed والسجلات ثنائيًا مثاليًا. فالواجهة sealed تحدد مجموعة مغلقة من الحالات، ويكون كل سجل حالة ملموسة وغير قابلة للتغيير. ومعًا، تتيح هذه العناصر نمذجة أنواع البيانات الجبرية.
السجلات تكون final ضمنيًا
يكون السجل final تلقائيًا، ولذلك يستوفي قاعدة أن تكون الأنواع الفرعية المسموح بها final أو sealed أو non-sealed. ولا حاجة إلى مُعدّل إضافي.
تسلسل هرمي مغلق للأشكال
نمذج الأشكال كسجلات تنفّذ واجهة sealed، بحيث يحمل كل سجل بياناته الخاصة.
public class Main {
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
public static void main(String[] args) {
Shape s = new Rectangle(3, 4);
System.out.println(s);
}
}إضافة السلوك
يمكن للواجهة sealed تعريف أساليب تنفّذها كل السجلات، مما يوفّر تعدد الأشكال ضمن المجموعة المغلقة.
public class Main {
sealed interface Shape permits Circle, Rectangle {
double area();
}
record Circle(double radius) implements Shape {
public double area() { return Math.PI * radius * radius; }
}
record Rectangle(double width, double height) implements Shape {
public double area() { return width * height; }
}
public static void main(String[] args) {
Shape s = new Circle(2);
System.out.printf("Area: %.2f%n", s.area());
}
}مساواة وtoString مجانيتان
تنشئ السجلات equals وhashCode وtoString تلقائيًا. ويكون السجلان المتساويان في المكوّنات متساويين، مما يجعلهما مثاليين لنمذجة القيم.
public class Main {
sealed interface Shape permits Circle {}
record Circle(double radius) implements Shape {}
public static void main(String[] args) {
Circle a = new Circle(5);
Circle b = new Circle(5);
System.out.println(a.equals(b));
System.out.println(a);
}
}نمذجة النتائج
من الأنماط الشائعة استخدام نوع نتيجة sealed مع سجل للنجاح وسجل للفشل، بدلًا من إرجاع قيم nullable أو طرح استثناءات للنتائج المتوقعة.
public class Main {
sealed interface Result permits Ok, Err {}
record Ok(int value) implements Result {}
record Err(String message) implements Result {}
static Result parse(String s) {
try { return new Ok(Integer.parseInt(s)); }
catch (NumberFormatException e) { return new Err("bad number: " + s); }
}
public static void main(String[] args) {
System.out.println(parse("42"));
System.out.println(parse("oops"));
}
}منشئات مختصرة للتحقق
يمكن للسجلات التحقق من مدخلاتها في منشئ مختصر، مما يحافظ على صحة كل حالة منذ إنشائها.
public class Main {
sealed interface Shape permits Circle {}
record Circle(double radius) implements Shape {
Circle {
if (radius < 0) throw new IllegalArgumentException("radius must be >= 0");
}
}
public static void main(String[] args) {
try { new Circle(-1); }
catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
}
}نماذج بيانات递归ية
بما أن السجل يمكنه الإشارة إلى الواجهة sealed، يمكنك إنشاء هياكل递归ية مثل أشجار التعبيرات أو القوائم المرتبطة.
public class Main {
sealed interface Expr permits Num, Add {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
public static void main(String[] args) {
Expr e = new Add(new Num(1), new Add(new Num(2), new Num(3)));
System.out.println(e);
}
}فوائد عدم القابلية للتغيير
السجلات غير قابلة للتغيير بشكل سطحي، ولذلك يسهل فهم التسلسل الهرمي للسجلات sealed، وتصبح مشاركته آمنة وملائمة للتزامن. ولا حاجة إلى إجراء نسخ دفاعي للسجلات نفسها.
الاقتران مع switch
تتألق السجلات sealed مع switch المطابق للأنماط: إذ يمكن لكل حالة تفكيك سجل، ويتحقق المصرّف من تغطية جميع الحالات. وسيُشرح ذلك في دورة الأنماط.
حساب على النموذج
يمكنك كتابة مفسّر على هيئة أسلوب يتنقّل عبر شجرة السجلات递递وية.
public class Main {
sealed interface Expr permits Num, Add {}
record Num(int value) implements Expr {}
record Add(Expr left, Expr right) implements Expr {}
static int eval(Expr e) {
if (e instanceof Num n) return n.value();
Add a = (Add) e;
return eval(a.left()) + eval(a.right());
}
public static void main(String[] args) {
Expr e = new Add(new Num(4), new Add(new Num(5), new Num(6)));
System.out.println(eval(e));
}
}تحقق سريع
اختبر مدى فهمك للسجلات sealed.
مراجعة
تعلّمت الجمع بين الأنواع sealed والسجلات.
- السجلات final ضمنيًا، ولذلك يمكنها أن تكون أنواعًا فرعية مسموحًا بها.
- يمكن للواجهة sealed تعريف أساليب مشتركة.
- توفر السجلات المساواة وحساب التجزئة وtoString تلقائيًا.
- تتيح هذه العناصر معًا نمذجة بيانات مغلقة وغير قابلة للتغيير وربما递递وية.
الأسئلة الشائعة
هل درس «الأنواع المختومة مع Records» مجاني؟
نعم — نص درس «الأنواع المختومة مع Records» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأنواع المختومة مع Records»؟
نمذجة التراتبيات المغلقة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الأنواع المختومة مع Records»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التصريح بالأنواع المختومة
- جملة permits
- الأنواع المختومة مع Records
- التبديل الشامل على نوع مختوم