Records في Java
أعلن نوع بيانات مضغوطاً بـrecord واقرأ مكوّناته. في Card.java أبقِ record Tag(String name) {} على مستوى الحزمة بلا public، وأبقِ الفئة العامة Card، أنشئ Tag t = new Tag("oak");، واطبع t.name(). جمّع بـjavac Card.java وشغّل java Card. يجب أن تعرض الشاشة oak. عرض ثانٍ يضيف مكوّناً int فتعرض الشاشة oak، ثم 3. اترك JUnit الاختياري للصفحة التالية. هذا الدرس record مع واصفات، وليس أنبوب Streams وليس جولة Lambda forEach.
مكوّن واحد، واصف واحد
افتح Card.java. أبقِ اسم الفئة العامة Card. احذف عروض أنبوب Pipe streams المتبقية، وطباعات lambda Cue المتبقية، وقوائم generics Bin المتبقية، ومطالبات Scanner من Box المتبقية إن دفنت قصة Records. البرنامج لا ينبغي أن ينتظر كتابة ولا يبدأ أنبوب stream.
فوق الفئة العامة، أعلن الـrecord:
record Tag(String name) {}
داخل Card.main، أنشئ نسخة واحدة واطبع الواصف:
Tag t = new Tag("oak");
System.out.println(t.name());
رأس الـrecord يسرد المكوّنات بين قوسين. Java تولّد المُنشئ والواصف name() لذلك المكوّن. الشاشة تعرض oak.
record Tag(String name) {}
public class Card {
public static void main(String[] args) {
Tag t = new Tag("oak");
System.out.println(t.name());
}
}
من المجلد الذي يضم Card.java، شغّل javac Card.java. عندما تتطابق الأقواس والأقواس المعقوفة، لا يكتب javac سطراً خاصاً به. ثم شغّل java Card — وليس java Card.java وليس java Tag. أبقِ فئة عامة واحدة ليتطابق اسم التشغيل مع Card. يبقى الـrecord Tag على مستوى الحزمة بلا public في نفس الملف.
امشِ التشغيل مرة. Java تبدأ عند Card.main. new Tag("oak") يخزّن المكوّن. t.name() يعيد "oak". println يكتب oak. لا شيء يستدعي stream(). لا شيء يستدعي forEach. لا شيء يقرأ args[0].
قل قاعدة المبتدئ وأنت تراقب الشاشة: record يسمّي النوع ومكوّناته؛ الواصف يطابق اسم المكوّن؛ أنشئ بـnew. لا تخترع عروض JUnit على هذه الصفحة. JUnit ينتظر الدرس الاختياري التالي. لا تستبدل الـrecord بصنف طويل مكتوب يدوياً مليء بـgetters في ملف التعليم — أبقِ رأس record.
إن ما زلت ترى OAK ثم PINE من ملف Pipe streams متبقي، انتقل إلى Card وأبقِ t.name(). إن اشتكى javac من نوعين عامين، أبقِ Card فقط عامة واترك record Tag بلا public.
مكوّنان، طباعتان
أبقِ نفس الفئة العامة Card. وسّع الـrecord إلى مكوّنين:
record Tag(String name, int n) {}
Tag t = new Tag("oak", 3);
System.out.println(t.name());
System.out.println(t.n());
جمّع مجدداً بـjavac Card.java وشغّل java Card. الشاشة تعرض oak، ثم 3. كل مكوّن يحصل على واصف بنفس الاسم. ترتيب الرأس يطابق وسائط المُنشئ.
record Tag(String name, int n) {}
public class Card {
public static void main(String[] args) {
Tag t = new Tag("oak", 3);
System.out.println(t.name());
System.out.println(t.n());
}
}
امشِ التشغيل مرة. name() يعيد "oak". n() يعيد 3. أبقِ العرضين كشكلين تعليميين. أولاً أثبت مكوّناً واحداً. ثم أثبت مكوّنين. كلا الشكلين يتقاسمان record على مستوى الحزمة بجانب Card العامة.
إن بدّلت وسائط المُنشئ، تقع القيم في المكوّنات الخاطئة. أبقِ "oak" أولاً و3 ثانياً في ملف التعليم الذي تحتفظ به.
عادات Record
أبقِ الرأس المضغوط والواصفات معاً أثناء التمرين.
📊 عادات record لـCard
| عادة | الشكل | فحص المبتدئ |
|---|---|---|
| إعلان | record Tag(String name) {} |
المكوّنات في الرأس |
| إنشاء | new Tag("oak") |
الوسائط تطابق ترتيب المكوّنات |
| قراءة | t.name() |
اسم الواصف يطابق المكوّن |
| حقلان | record Tag(String name, int n) {} |
لكل مكوّن واصفه |
| فئة عامة | public class Card |
شغّل بـjava Card، وليس java Tag |
Records ليست Streams وليست JUnit
Streams صفّت وحوّلت قيم القائمة عبر أنبوب. Records تحمل مجموعة ثابتة من المكوّنات في نوع مضغوط. JUnit سيفحص السلوك باختبارات في صفحة اختيارية لاحقة. لا تخلط هذه المهام الثلاث في ملف مبتدئ واحد اليوم.
oak هنا قيمة مكوّن record يعيدها name(). ليست نتيجة filter من stream وليست زيارة Lambda forEach وحدها. عندما ما زال ملف Pipe يطبع كلمات map بأحرف كبيرة، اترك ذلك تاريخاً وأبقِ سطر t.name() في Card.
بلا كلمة record، يختفي الرأس المضغوط لهذه الصفحة. بلا وسائط مُنشئ متطابقة، يرفض javac الاستدعاء. أبقِ الرأس وسطر new متوافقين أثناء تمرين كل عرض. أبقِ تعليقات JUnit خارج هذه الصفحة حتى ذلك الدرس، حتى لو رأيت عنوان اختبار في مكان آخر على المسار الاختياري. فضّل شكل record القصير لتبقى الشاشة مربوطة بـname() وn() في كل قراءة دقيقة لملف التعليم.
فحوص المجلد قبل JUnit
اسرد المجلد بعد compile ناجح. ينبغي أن ترى Card.java وCard.class معاً، وعادة Tag.class للـrecord. عدّل المصدر، احفظ، شغّل javac Card.java، ثم java Card. ملف .class قديم قد يعرض شاشة سطر قديم إن تخطيت compile بعد إضافة n.
إن اشتكى javac من فئات عامة مكررة، أبقِ Card فقط عامة. إن أظهرت الشاشة Tag[oak] بدل oak، طبعت الـrecord كاملاً — أبقِ طباعة التعليم t.name(). إن لم يطبع شيء، تأكد أن main ما زال يستدعي println.
لا تلصق stream().map من Pipe في Card. لا تلصق forEach من Cue كبديل لقصة الـrecord. مهمة Records الاختيارية نوع مضغوط مع واصفات.
قبل JUnit الاختياري
يمكنك أن تبقي record Tag(String name) {}، وتنشئ new Tag("oak")، وتطبع t.name() كـoak، ثم تستخدم record Tag(String name, int n) {}، وتطبع oak و3. جمّع بـjavac Card.java وشغّل java Card. الجدول يفصل الإعلان والإنشاء والقراءة. الصفحة الاختيارية التالية هي JUnit.
أبقِ عروض Card لزوج records واضح. أبقِ ملفات Pipe streams خارج هذه الصفحة عند تمرين Records. أبقِ ملفات lambda Cue خارج هذه الصفحة عند تمرين Records. أبقِ عمل JUnit خارج هذه الصفحة حتى ذلك الدرس. هذه العادات نقطة تفتيش قبل المتابعة. عندما تعرض شاشة الحقل الواحد oak أو شاشة الحقلين oak ثم 3، أنجزت Records عملها لهذا الدرس وأنت جاهز لـJUnit إن واصلت المسار الاختياري.
مرّة أخيرة على المجلد: Card عامة واحدة، record Tag على مستوى الحزمة، وسائط مُنشئ متطابقة، طباعات الواصفات، بلا انتظار Scanner، بلا أنبوب stream مطلوب. شغّل javac Card.java وjava Card مرة أخرى على العرض المفتوح. إن بقيت الشاشة تعرض oak أو oak ثم 3، شكل Records متين ويمكن للدورة الانتقال إلى JUnit الاختياري في الصفحة التالية. فضّل عادة record واضحة في كل قراءة ليعلّم كل مرور نفس الخريطة.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى