Record Pattern
تفكيك السجلات (Record Patterns) Record Pattern
record pattern يفكّك (destructure) قيمة record مباشرة داخل instanceof أو switch، بدل استدعاء دوال الوصول واحدة تلو الأخرى.
منذ Java 21، يمكن لـ instanceof وswitch مطابقة شكل record كامل واستخراج مكوّناته في خطوة واحدة: بدل obj instanceof Point p ثم p.x() وp.y() بشكل منفصل، تكتب obj instanceof Point(int x, int y) وتحصل على x وy جاهزتين كمتغيّرات.
تدعم الأنماط التداخل: لو كان record يحتوي على record آخر كمكوّن، يمكن تفكيك المستويين معًا في نمط واحد. يمكن استخدام var بدل كتابة النوع صراحة لكل مكوّن.
الصياغة
if (obj instanceof Record(نوع مكوّن1, نوع مكوّن2)) { }
switch (obj) {
case Record(نوع مكوّن1, نوع مكوّن2) -> ...;
}📄 مثال
public record Point(int x, int y) {}
// تفكيك مباشر بدون استدعاء x() وy():
if (obj instanceof Point(int x, int y)) {
System.out.println(x + y);
}
// داخل switch مع شرط when:
String describe(Object obj) {
return switch (obj) {
case Point(int x, int y) when x == y -> "على القطر";
case Point(int x, int y) -> "نقطة عادية";
default -> "غير معروف";
};
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| Record(نوع مكوّن...) | يطابق شكل record ويستخرج مكوّناته كمتغيّرات |
| var في النمط | بديل عن كتابة نوع كل مكوّن صراحة |
| أنماط متداخلة | تفكيك record يحتوي record آخر في خطوة واحدة |
| when | شرط إضافي بعد النمط داخل switch |
💡 نصائح عملية
- استخدمها بدل سلسلة استدعاءات .x() و.y() المتكررة، خصوصًا مع بيانات متداخلة
- دمجها مع sealed يمنح تطابقًا شاملًا (exhaustive) يتحقق منه المترجم
⚠️ أخطاء شائعة
- استخدام قيمة حرفية (مثل 0) داخل نمط متداخل — record pattern يطابق أنماطًا لا قيمًا؛ استخدم when للشرط
- افتراض أن الأنماط تعمل مع أي صنف — تعمل فقط مع record (أو أنماط النوع العادية مثل String s)
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار JAVA الكامل بالعربي.