1. يمكن إضافة سلاسل إلى العبارة الشرطية للتبديل. تتمثل الطريقة في استخدام قيمة hashcode() للسلسلة للحصول على القيمة الحقيقية.
2. تمت إضافة نظام أساسي يمكن استخدامه بالأرقام الحرفية الثنائية، وذلك بإضافة "0b" أو "0B" أمام الرقم.
3. استخدم الشرطة السفلية في الأرقام الحرفية الرقمية لفصل الأرقام لتسهيل القراءة دون التأثير على حجم القيمة. المبدأ الأساسي هو أن التسطير لا يمكن أن يظهر إلا إذا كانت هناك أرقام قبله وبعده.
قام 4.java7 بإجراء تغييرين على الاستثناءات:
4.1 يدعم التقاط استثناءات متعددة في نفس الوقت في جملة الصيد، والآخر هو جعل نوع الاستثناء أكثر دقة عند التقاط الاستثناءات وإعادة طرحها. تمت إضافة طريقة addSuppressed إلى فئة Throwable في Java 7. عند طرح استثناء، قد يتم منع الاستثناءات الأخرى بسبب الاستثناء، وبالتالي لا يمكن طرحها بشكل طبيعي. في هذا الوقت، يمكنك تسجيل هذه الأساليب المحظورة من خلال طريقة addSuppressed. وستظهر الاستثناءات المحظورة في معلومات المكدس الخاصة بالاستثناءات التي تم طرحها. ويمكنك أيضًا الحصول على هذه الاستثناءات من خلال طريقة getSuppressed. وميزة ذلك هي أنه لن يتم فقدان أي استثناءات، مما يسهل على المطورين اختبارها.
يعمل Java7 على تحسين بناء جملة Catch، مما يسمح بتحديد استثناءات متعددة فيها، ويتم فصل كل نوع استثناء بـ "|". تجدر الإشارة إلى أن الاستثناءات التي تم التقاطها في عبارة الصيد لا يمكن أن تحتوي على أنواع متكررة، ولا يُسمح لأحد الاستثناءات بأن يكون فئة فرعية لمعلمة استثناء أخرى، وإلا سيحدث خطأ في الترجمة (من الأحرف الصغيرة إلى الأحرف الكبيرة، لا توجد مشكلة ). إذا تم الإعلان عن استثناءات متعددة في عبارة الصيد، فإن النوع المحدد لمعلمة الاستثناء هو الحد الأعلى الأدنى لجميع أنواع الاستثناءات هذه.
4.2 استخدم محاولة (تطبيق الموارد) {معالجة الأعمال} لتحرير الموارد تلقائيًا. يجب أن تستوفي الموارد التي يمكن إدارتها من خلال عبارات المحاولة شرطًا واحدًا، وهو أن فئة Java الخاصة بها يجب أن تنفذ واجهة java.lang.AutoCloseable، وإلا فسيحدث خطأ في الترجمة. سوف يحدث. سيتم استدعاء طريقة الإغلاق لهذه الواجهة تلقائيًا عند الحاجة إلى تحرير الموارد.
5. تحسين استدعاءات الطريقة بمعلمات متغيرة الطول:
الميزة الجديدة المقدمة في j2se5.0 هي السماح باستخدام معلمات متغيرة الطول في إعلانات الطريقة. يمكن تحديد المعلمة الرسمية الأخيرة للطريقة لتمثيل أي عدد من المعلمات من نفس النوع. عند استدعائها، يتم تمرير هذه المعلمات في شكل مصفوفة. يمكن أيضًا الإشارة إلى هذه المعلمات كمصفوفات في نص الطريقة.
6. يقدم Java 7 تعليقًا توضيحيًا جديدًا @SafeVarargs. إذا كان المطور متأكدًا من أن الطريقة التي تستخدم معلمات متغيرة الطول لن تسبب موقفًا مشابهًا عند استخدامها مع فئة عامة، فيمكن الإعلان عنها باستخدام هذا التعليق التوضيحي. لا يمكن استخدام التعليق التوضيحيSafeVarargs إلا على الأساليب أو المنشئات ذات أطوال المعلمات المتغيرة، ويجب إعلان الطريقة ثابتة أو نهائية، وإلا سيحدث خطأ في الترجمة. إن فرضية الطريقة التي سيتم التعليق عليها باستخدام @SafeVarargs هي أن المطور يجب أن يتأكد من أن معالجة معلمات النوع العامة في تنفيذ هذه الطريقة لا تسبب مشكلات تتعلق بسلامة النوع.
7. تدعم Java بعض لغات البرمجة النصية في جهاز Java الظاهري من خلال محرك البرامج النصية. في الواقع، يدعم مدير محرك البرامج النصية ثلاث طرق لمحرك البحث، والتي يتم استكمالها بالاسم وامتداد الملف ونوع MIME. يحب
7.1 ربط اللغة:
من المزايا الرائعة لواجهة برمجة التطبيقات (API) لدعم لغة البرمجة النصية أنها توحد التفاعل بين لغة Java ولغة البرمجة النصية، بحيث يمكن للبرامج المكتوبة بلغة Java إجراء استدعاءات أسلوب ثنائية الاتجاه ونقل البيانات باستخدام البرامج النصية. يتم نقل البيانات من خلال كائنات ربط اللغة. ما يسمى بكائن ربط اللغة هو جدول تجزئة بسيط يستخدم لتخزين البيانات التي تحتاج إلى مشاركتها والحصول عليها. تتوافق جميع البيانات مع إدخال في جدول التجزئة هذا وهي عبارة عن زوج بسيط من الاسم والقيمة. تحدد الواجهة javax.script.Bingings واجهة كائنات ربط اللغة، والتي ترث من واجهة java.util.Map. قد يستخدم محرك البرنامج النصي كائنات ربط لغات متعددة أثناء التنفيذ. اللغات المختلفة لها نطاقات مختلفة لربط الكائنات. افتراضيًا، سيوفر محرك البرنامج النصي كائنات ربط متعددة اللغات لتخزين الكائنات العامة التي تم إنشاؤها أثناء التنفيذ. توفر فئة ScriptEnging أساليب الوضع والحصول على العمل على كائنات ربط اللغة الافتراضية المستخدمة خصيصًا في محرك البرامج النصية. يمكن للبرامج استخدام كائن ربط اللغة الافتراضي هذا مباشرةً، أو يمكنها استخدام كائنات ربط اللغة الخاصة بها. أثناء تنفيذ البرنامج النصي، يمكن اعتبار كائن ربط اللغة بمثابة جدول تعيين متغير إضافي. يتم أيضًا أخذ الأسماء الموجودة في كائنات ربط اللغة في الاعتبار عند تحليل القيم المتغيرة. ستظهر المتغيرات العامة والمحتويات الأخرى التي تم إنشاؤها أثناء تنفيذ البرنامج النصي في كائن ربط اللغة. بهذه الطريقة، يتم إكمال نقل البيانات في الاتجاهين بين Java ولغة البرمجة النصية.
على سبيل المثال، تتم إضافة سلسلة تسمى "اسم" إلى كائن ربط اللغة الافتراضي لمحرك البرنامج النصي من خلال طريقة الوضع الخاصة بـ ScriptEngine، ثم تتم الإشارة إلى الكائن مباشرة بالاسم في البرنامج النصي. وبالمثل، يمكن أيضًا الحصول على "رسالة" المتغير العام الذي تم إنشاؤه في البرنامج النصي من خلال طريقة get الخاصة بـ ScriptEnging. يحقق هذا نقل البيانات في اتجاهين بين برامج Java والبرامج النصية. يتم إكمال تحويل النوع أثناء نقل البيانات بواسطة محرك البرنامج النصي، وتعتمد قواعد التحويل على القواعد النحوية للغة المحددة.
في معظم الحالات، يكون استخدام أساليب put and get الخاصة بـ ScriptEnging كافيًا. إذا تم استخدام أساليب put and get فقط، فسيكون كائن ربط اللغة نفسه شفافًا للمطور. في بعض الحالات، من الضروري استخدام كائن ربط اللغة الخاص بالبرنامج، على سبيل المثال، يحتوي كائن ربط اللغة على البيانات الفريدة الخاصة بالبرنامج. إذا كنت تريد استخدام كائن ربط اللغة الخاص بك، فيمكنك استدعاء الأسلوب creatBingings الخاص بمحرك البرنامج النصي أو إنشاء كائن javax.script.SimpleBingings وتمريره إلى أسلوب التقييم الخاص بمحرك البرنامج النصي، مثل:
كائن ربط اللغة الذي تم تمريره عبر أسلوب التقييم يصبح ساري المفعول فقط في استدعاء التقييم الحالي ولا يغير كائن ربط اللغة الافتراضي للمحرك.
7.2 سياق تنفيذ البرنامج النصي واجهة أخرى مهمة تتعلق بتنفيذ محرك البرنامج النصي هي javax.script.ScriptContext، والتي تحتوي على معلومات السياق ذات الصلة أثناء تنفيذ محرك البرنامج النصي ويمكن مقارنتها بواجهة javax.servlet.ServletContext في مواصفات servlet في JavaEE . يحصل محرك البرنامج النصي على المعلومات المتعلقة بتنفيذ البرنامج النصي من خلال الرجوع إلى كائن السياق، كما يسمح للمطورين بتكوين سلوك محرك البرنامج النصي من خلال هذا الكائن. تحتوي الكائنات العلوية والسفلية بشكل أساسي على الأنواع الثلاثة التالية من المعلومات.
7.2.1 الإدخال والإخراج أولاً، يتم تقديم معلومات التكوين المتعلقة بإدخال وإخراج البرنامج النصي، بما في ذلك كائن java.io.Reader الذي يستخدمه البرنامج النصي لقراءة إدخال البيانات أثناء التنفيذ وjava.io.Writer الذي يقوم بإخراج المحتوى الصحيح و معلومات الخطأ. بشكل افتراضي، يتم إدخال وإخراج البرنامج النصي في وحدة التحكم القياسية. إذا كنت تريد كتابة إخراج البرنامج النصي إلى ملف، فيمكنك استخدام التعليمة البرمجية التالية. إعادة توجيه إخراج البرنامج النصي إلى ملف من خلال طريقة setWriter. من خلال طريقتي setReader وsetErrorWriter في ScriptContext، يمكنك على التوالي تعيين مصدر إدخال البيانات عند تنفيذ البرنامج النصي ووجهة الإخراج لرسالة الخطأ عند حدوث خطأ.
7.2.2 الخصائص المخصصة
يحتوي ScriptContext أيضًا على طرق للحصول على السمات المشابهة لتلك الموجودة في ServletContext وتعيينها، وهي setAttribute وgetAttribute، والفرق هو أن السمات الموجودة في ScriptContext يتم تحديد نطاقها. الفرق بين النطاقات المختلفة هو ترتيب البحث. يستخدم كل نطاق عددًا صحيحًا مطابقًا لتمثيل ترتيب البحث الخاص به. كلما كانت القيمة الصحيحة أصغر، زادت الأولوية في ترتيب البحث. ستؤدي الخصائص الموجودة في نطاق ذي أولوية أعلى إلى إخفاء الخصائص التي لها نفس الاسم في نطاق ذي أولوية أقل. لذلك، تحتاج إلى تحديد النطاق بشكل صريح عند تعيين الخصائص. عند الحصول على السمات، يمكنك اختيار البحث في نطاق محدد، أو يمكنك اختيار البحث تلقائيًا بناءً على أولوية النطاق.
ومع ذلك، تم إصلاح النطاق المضمن في تنفيذ سياق تنفيذ البرنامج النصي. المطورون ليسوا أحرارًا في تحديد نطاقهم الخاص. يمكن الحصول على قائمة بجميع النطاقات المتاحة من خلال طريقة getScopes الخاصة بـ ScriptContext. يوجد نطاقان محددان مسبقًا في SciptContext: النطاق الذي يمثله الثابت ScriptContext.ENGINE_SCOPE يتوافق مع محرك البرنامج النصي الحالي، والنطاق الذي يمثله ScriptContext.GLOBAL_SCOPE يتوافق مع جميع كائنات محرك البرنامج النصي التي تم إنشاؤها من نفس مصنع المحرك. السابق لديه أولوية أعلى. على سبيل المثال:
7.2.3 كائنات ربط اللغة
النوع الأخير من المعلومات في سياق تنفيذ البرنامج النصي هو كائن ربط اللغة. تتوافق كائنات ربط اللغة أيضًا مع النطاقات. ينطبق نفس ترتيب أسبقية النطاق على الكائنات المرتبطة باللغة. سيكون لترتيب الأولوية هذا تأثير على الدقة المتغيرة أثناء تنفيذ البرنامج النصي. على سبيل المثال:
Bindings.put("اسم"،"العالم")
Engine.eval("println(name);");
7.3 تجميع النصوص:
يتم تفسير وتنفيذ لغات البرمجة النصية بشكل عام. يحتاج محرك البرنامج النصي إلى تحليل البرنامج النصي قبل تنفيذه في وقت التشغيل. بشكل عام، تشغيل البرنامج النصي من خلال الترجمة الفورية سيكون أبطأ من تشغيله بعد التجميع. عندما يلزم تنفيذ البرنامج النصي عدة مرات، يمكن تجميع البرنامج النصي أولاً. لا يحتاج البرنامج النصي المترجم إلى التحليل بشكل متكرر عند تنفيذه، مما قد يؤدي إلى تحسين كفاءة التنفيذ. لا تدعم كافة محركات البرامج النصية تجميع البرامج النصية. إذا كان محرك البرامج النصية يدعم هذه الميزة، فسوف يقوم بتنفيذ واجهة javax.script.Compilable للإعلان عن ذلك. يمكن لمستخدمي محركات البرامج النصية الاستفادة من هذه الإمكانية لتحسين كفاءة البرامج النصية التي يجب تنفيذها عدة مرات. يدعم محرك البرامج النصية JavaScript الذي يأتي مع Java SE تجميع البرامج النصية.
في التعليمة البرمجية التالية، يتم استخدام طريقة الترجمة للواجهة القابلة للترجمة لتجميع التعليمات البرمجية النصية، ويتم تمثيل نتيجة الترجمة بواسطة javax.script.CompiledScript. نظرًا لعدم دعم كافة محركات البرامج النصية للواجهة القابلة للترجمة، يجب استخدام المثيل للحكم هنا. في طريقة التشغيل، يمكن تنفيذ البرنامج النصي من خلال طريقة التقييم الخاصة بـ CompiledScript. في التعليمات البرمجية، يتم تنفيذ البرنامج النصي بشكل متكرر 100 مرة لتوضيح ميزة أداء البرنامج النصي المترجم عند تنفيذه بشكل متكرر.
تشغيل الفراغ العام (String scriptText) يلقي ScriptException {
CompiledScript script = compiled(scriptText);
إذا (النص == فارغ) {
يعود؛
}
لـ (int i = 0; i < 100; i++) {
script.eval();
}
}
7.4 استدعاءات الأساليب في البرامج النصية، أكثر الأساليب شيوعًا وعملية في البرامج النصية هي الأساليب. تسمح بعض محركات البرامج النصية للمستخدمين باستدعاء طريقة ما في البرنامج النصي بشكل فردي. يمكن لمحركات البرامج النصية التي تدعم استدعاء هذا الأسلوب تنفيذ واجهة javax.script.Invocable. من خلال واجهة Invocable، يمكنك استدعاء أساليب المستوى الأعلى في البرامج النصية وأساليب الأعضاء في الكائنات. إذا كانت طريقة المستوى الأعلى في البرنامج النصي أو طريقة العضو في الكائن تنفذ الواجهة في Java، فيمكنك الحصول على كائن التنفيذ لواجهة Java المقابلة في البرنامج النصي من خلال الطريقة الموجودة في واجهة Invocable. بهذه الطريقة، يمكن تعريف الواجهة بلغة Java وتنفيذها في البرنامج النصي. الأجزاء الأخرى من البرنامج التي تستخدم الواجهة لا تعرف أن الواجهة يتم تنفيذها بواسطة البرنامج النصي. مثل الواجهة القابلة للترجمة، يعد تنفيذ ScriptEngine للواجهة القابلة للاستدعاء اختياريًا أيضًا.
يستدعي التعليمة البرمجية التالية أسلوب المستوى الأعلى في البرنامج النصي من خلال وظيفة الاستدعاء للواجهة القابلة للاستدعاء. سيتم تمرير المعلمات أثناء الاستدعاء إلى الأسلوب الموجود في البرنامج النصي. نظرًا لأن محرك البرنامج النصي JavaScript الذي يأتي مع JavaSE يقوم بتنفيذ واجهة Invocable، فسيتم حذف الحكم على ما إذا كان المحرك يقوم بتنفيذ واجهة Invocalbe هنا. مثال على استدعاء أسلوب المستوى الأعلى للبرنامج النصي في Java:
// مثال على استدعاء أساليب الأعضاء لكائن البرنامج النصي في Java
7.5 تنفيذ واجهة جافا في البرنامج النصي
في بعض محركات البرامج النصية، يمكن تعريف الواجهة بلغة Java ويمكن كتابة تنفيذ الواجهة في البرنامج النصي، وبهذه الطريقة، يمكن لأجزاء أخرى من البرنامج التفاعل مع واجهة Java فقط ولا تحتاج إلى الاهتمام بها كيف يتم تنفيذ الواجهة. في التعليمة البرمجية التالية، تعتبر Greet واجهة محددة في Java، والتي تحتوي على طريقة getGreeting. قم بتنفيذ هذه الواجهة في البرنامج النصي من خلال طريقة getInterface، يمكنك الحصول على كائن الواجهة الذي ينفذه البرنامج النصي واستدعاء الأساليب الموجودة فيه.
نظرًا لأن بناء جملة لغة البرنامج النصي بسيط ومرن، فهو مناسب جدًا للمستخدمين الذين ليس لديهم خلفية برمجة أو لديهم فقط قدر صغير من الخبرة. يمكن لهؤلاء المستخدمين استخدام لغة البرنامج النصي لتخصيص منطق العمل وواجهة المستخدم للبرنامج النصي يمكن للغة تحسين سهولة استخدام البرنامج ويتم تحقيق توازن أفضل بين المرونة والمرونة. على سبيل المثال، تُستخدم لغة البرمجة النصية Lua على نطاق واسع في تطوير اللعبة لتخصيص السلوك الداخلي وواجهة المستخدم الخاصة باللعبة.
8. على الرغم من أن واجهة برمجة تطبيقات الانعكاس توفر المرونة لبرامج Java، إلا أنها تتحمل أيضًا تكاليف أداء إضافية نظرًا لآلية تنفيذ واجهة برمجة تطبيقات الانعكاس، لنفس العملية، مثل استدعاء الطريقة، فإن استخدام واجهة برمجة تطبيقات الانعكاس لتنفيذها ديناميكيًا يكون أسرع. من تنفيذها مباشرة في المصدر، من المحتمل أن تكون طريقة كتابة الكود أبطأ بمقدار واحد أو اثنين. مع تحسين تنفيذ آلة Java الافتراضية، تم تحسين أداء واجهة برمجة تطبيقات الانعكاس بشكل كبير. ومع ذلك، توجد فجوة الأداء هذه بشكل موضوعي، لذلك، في بعض التطبيقات التي لديها متطلبات أداء عالية نسبيًا، يجب استخدام واجهات برمجة التطبيقات الانعكاسية بحذر.