جافا 14: معاينة السجلات

قريباً ، ستظهر ميزة بناء جملة جديدة في سجلات Java 14 القادمة . بعد دراسة المعاينة ، التي تصف بإيجاز كيف تبدو التسجيلات ومع "ما تأكله" ، تجرأت على تكييف الوثيقة مع اللغة الروسية للحبر. من يهتم - مرحبا بكم في القط.


ملخص


تتيح لك الإدخالات توسيع إمكانيات Java. أنها توفر بناء جملة موجزة لإعلان الطبقات التي هي الناقلات البسيطة لمجموعات البيانات الثابتة وغير الثابتة.

الأسباب والأهداف


تعتبر الشكاوى التي تشير إلى أن "Java مطوّل جدًا" وتحتاج إلى "الاحتفال" بها أمر شائع جدًا. السبب في ذلك هو الفئات المصممة فقط لتخزين مجموعة بيانات معينة. لكتابة مثل هذه الفئة بشكل صحيح ، تحتاج إلى كتابة الكثير من التعليمات البرمجية الرسمية والمتكررة والمعرضة للخطأ: المُنشئون ، والأحرف والأوصاف ، والمساواة () ، hashCode () ، toString () ، إلخ. يقوم المطورون أحيانًا بالغش وعدم إعادة تعريف يساوي () و hashCode () ، والذي بدوره قد يؤدي إلى سلوك غير عادي أو مشاكل في تصحيح الأخطاء. أو عندما لا يرغب المطورون في الإعلان عن فصل آخر ، فإنهم يصفون بديلًا ، ولكن ليس مناسبًا تمامًا ، لمجرد أنه يحتوي على "الشكل الصحيح".

ستساعد بيئات التطوير في تسجيل معظم الكود في الفصل ، لكنها لن تساعد المطور في قراءة هذا الكود للتنقل بسرعة بين عشرات الأسطر من الكود المتداول وفهم أن هذه الفئة هي حامل بيانات عادي. يجب أن تكون مجموعات البيانات القياسية لنمذجة جافا بسيطة في الكتابة والفهم والتحقق من الصحة.

للوهلة الأولى ، قد يبدو أن السجلات تهدف إلى تقليل رمز القالب. نضع الهدف الدلالي فيها: "نمذجة البيانات كبيانات" (نمذجة البيانات كبيانات). إذا كانت الدلالات صحيحة ، فإن رمز القالب سيفعل كل شيء بنفسه دون مشاركة المطور. بعد كل شيء ، يجب أن يكون إعلان مجموعات البيانات المستمرة أمرًا سهلاً وواضحًا وموجزًا.

الأهداف التي لم تكن كذلك


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

وصف


الإدخالات هي نوع جديد من إعلان النوع في Java. مثل التعداد ، والكتابة هي فئة محدودة وظيفيا. تعلن عن وجهة نظرها وتوفر API التي تبني على هذا الرأي. لا تفصل الإدخالات واجهة برمجة التطبيقات عن العرض التقديمي ، وبالتالي فهي مختصرة.

يحتوي الإدخال على اسم ووصف للحالة. يوضح وصف الحالة مكونات هذا السجل. اختياريا ، قد يكون للسجل هيئة. على سبيل المثال:

record Point(int x, int y) { } 

نظرًا لأن السجلات بشكل دلالي عبارة عن ناقلات بيانات بسيطة ، فإنها تتلقى العناصر القياسية تلقائيًا:

  • مجال أخير خاص لكل مكون دولة ؛
  • طريقة قراءة عامة لكل مكون دولة له نفس اسم ونوع المكون ؛
  • مُنشئ عام يطابق توقيع السجل ؛ تهيئة كل حقل من الوسيطة المقابلة ؛
  • تطبيقات equals () و hashCode () ، والتي تقول أن سجلين متساويين إذا كانا من نفس النوع ويحتويان على الحالة نفسها ؛
  • تطبيق toString () ، والذي يتضمن تمثيل سلسلة لجميع مكونات التسجيل بأسمائها.

بمعنى آخر ، يعتمد عرض السجل كليًا على وصف للحالة. أيضًا ، بناءً على حالة السجل ، يحدث تشكيل يساوي () ، hashCode () و toString ().

قيود


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

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

مكونات التسجيل نهائية. ينفذ هذا التقييد مبدأ "لم يتغير افتراضيًا" ، والذي يستخدم على نطاق واسع لمجموعات البيانات.

بالإضافة إلى القيود المذكورة أعلاه ، تتصرف السجلات مثل الفئات العادية: يمكن إعلانها على أنها من المستوى الأعلى أو متداخلة ، ويمكن أن تكون عامة ، ويمكن أن تنفذ واجهات. يتم إنشاء السجلات عن طريق استدعاء المشغل الجديد. يمكن لنص الكتابة أن يعلن الطرق الثابتة والحقول الثابتة وكتل التهيئة الثابتة والمنشئين وطرق المثيل وكتل تهيئة المثيلات والأنواع المتداخلة. قد يتم إضافة تعليقات توضيحية إلى السجل ومكونات الحالة الفردية. إذا كان السجل متداخلًا ، فسيكون ثابتًا ؛ هذا يحل الموقف مع المثيلات المتداخلة التي يمكن أن تضيف تلقائيا الدولة إلى السجل.

معلن صراحة إدخالات


على الرغم من أن التنفيذ القياسي لـ getters ، بالإضافة إلى أساليب equals () و hashCode () و toString () ، مقبول بالنسبة لمعظم حالات الاستخدام ، فإن المطور لديه خيار لتجاوز التطبيق القياسي. ومع ذلك ، يجب أن تكون حذراً خاصة عند تجاوز أساليب يساوي / hashCode.

يتم إيلاء اهتمام خاص للإعلان الواضح للمنشئ الكنسي ، الذي يتطابق توقيعه مع وصف حالة السجل. يمكن التصريح عن المُنشئ بدون قائمة معلمات رسمية: في هذه الحالة ، يُفترض أنه يتزامن مع وصف الحالة ، ويتم تهيئة أي حقول سجل ضمنيا عن طريق إغلاق معيار لبنية المنشئ من المعلمات الرسمية المقابلة (هذا. X = x) في الإخراج. يسمح هذا للمنشئ الكنسي بالتحقق من المعلمات وضبطها فقط ، وكذلك تخطي تهيئة الحقل الصريح. على سبيل المثال:

 record Range(int lo, int hi) { public Range { if (lo > hi) /* referring here to the implicit constructor parameters */ throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi)); } } 

قواعد


 RecordDeclaration: {ClassModifier} record TypeIdentifier [TypeParameters] (RecordComponents) [SuperInterfaces] [RecordBody] RecordComponents: {RecordComponent {, RecordComponent}} RecordComponent: {Annotation} UnannType Identifier RecordBody: { {RecordBodyDeclaration} } RecordBodyDeclaration: ClassBodyDeclaration RecordConstructorDeclaration RecordConstructorDeclaration: {Annotation} {ConstructorModifier} [TypeParameters] SimpleTypeName [Throws] ConstructorBody 

شروح لمكونات التسجيل


يمكن تطبيق التعليقات التوضيحية على مكونات التسجيل إذا كانت تنطبق على المكونات أو المعلمات أو الحقول أو الطرق. تنطبق التعليقات التوضيحية للإعلان التي تنطبق على أي من هذه المكونات على الإعلانات الضمنية لأي عناصر مطلوبة.

تمتد التعليقات التوضيحية التي تغير أنواع مكونات السجل إلى أنواع في الإعلانات الضمنية للعناصر المطلوبة (على سبيل المثال ، معلمات المُنشئ ، وإعلانات الحقل ، والأساليب). يجب أن تتطابق الإعلانات الصريحة للعناصر المطلوبة تمامًا مع نوع المكون المقابل للسجل ، وليس بما في ذلك التعليقات التوضيحية للنوع.

انعكاس API


ستتم إضافة الطرق العامة التالية إلى java.lang.Class :

  • RecordComponent [] getRecordComponents ()
  • منطقية isRecord ()

إرجاع الأسلوب getRecordComponents () صفيف java.lang.reflect.RecordComponent ، حيث java.lang.reflect.RecordComponent فئة جديدة.

تتوافق عناصر هذه المجموعة مع مكونات السجل وتنتقل بنفس الترتيب الذي تم إعلانه به في السجل. يمكن استخراج معلومات إضافية من كل RecordComponent في الصفيف ، بما في ذلك الاسم والنوع والعامة ، وكذلك قيمتها.

إرجاع الأسلوب isRecord () صحيح إذا تم تعريف هذه الفئة كسجل. (على غرار طريقة isEnum () ).

البدائل


يمكن تعريف السجلات بالشكل الشرطي للتلاميذ. بدلا من السجلات ، يمكننا استخدام tuples الهيكلية. على الرغم من أن tuples تقدم طرقًا أكثر وزنًا للتعبير عن بعض مجموعات البيانات ، إلا أن النتيجة غالبًا ما تكون أقل إفادة:

  • المبدأ الرئيسي لفلسفة جافا هو أن الأسماء مهمة . تحمل الفئات وعناصرها أسماءًا ذات صلة بمحتواها ، بينما لا تحتوي المجموعات والمكونات الخاصة بها. بمعنى أن فئة الشخص مع خصائص الاسم الأول واسم العائلة أكثر قابلية للفهم وموثوقية من المجموعة المجهولة من السلسلة والسلسلة .
  • الطبقات تدعم التحقق من صحة الدولة من خلال صانعيها ، tuples لا. تحتوي بعض مجموعات البيانات ، مثل النطاقات الرقمية ، على ثوابت يمكن الرجوع إليها فيما بعد إذا تم استخدامها من قبل المُنشئ ؛
  • الفصول قد يكون السلوك على أساس حالتهم. مزيج من الدولة والسلوك يجعل السلوك نفسه أكثر وضوحا ويمكن الوصول إليها. Tuples ، كونها مجرد مجموعة بيانات ، لا تقدم مثل هذه الفرصة.

اعتمادا على


تسير السجلات بشكل جيد مع الأنواع المعزولة (JEP 360) ؛ جنبا إلى جنب مع أنواع معزولة ، والسجلات تشكل بناء ، وغالبا ما تسمى أنواع البيانات الجبرية. بالإضافة إلى ذلك ، تتيح الإدخالات نفسها مطابقة النمط . لأن السجلات تربط واجهات برمجة التطبيقات الخاصة بهم مع أوصاف الحالة ، يمكننا أيضًا في النهاية الحصول على أنماط تفكيك للسجلات واستخدام معلومات الفئات المعزولة في بيان التبديل .

Source: https://habr.com/ru/post/ar484700/


All Articles