قائمة المعلمات المتغيرة Java
نسخة الكود كما يلي:
الفئة A {}
نظرًا لأن جميع الفئات موروثة من الكائن ، يمكنك استخدام صفيف الكائن كمعلمة:
المعلمة الفئة العامة {static void printarray (Object [] args) {for (Object obj: args) {system.out.print (obj + "") ؛ } system.out.println () ؛ } public static void main (string [] args) {printArray (كائن جديد [] {new integer (47) ، New Float (3.14) ، New Double (11.11)}) ؛ PrintArray (كائن جديد [] {"واحد" ، "اثنين" ، "هناك"}) ؛ printArray (كائن جديد [] {new a () ، new a () ، new a ()}) ؛ }} بالنسبة لإصدارات Java SE5 بعد إضافة ميزات ، يمكنك كتابة هذا:
المعلمة الفئة العامة {public static void printarray (Object ... args) {for (Object obj: args) {system.out.print (obj + "") ؛ } system.out.println () ؛ } public static void main (string [] args) {printArray (New Integer (47) ، New Float (3.14) ، New Double (11.11)) ؛ PrintArray (47 ، 3.14f ، 11.11) ؛ printarray ("واحد" ، "اثنين" ، "ثلاثة") ؛ printArray (new a () ، new a () ، new a ()) ؛ printArray ((Object []) integer [] {1 ، 2 ، 3 ، 4}) ؛ printArray () ؛ }} يمكنك استخدام كائن للتفكير في قائمة المعلمات:
الفئة العامة varargtype {static void f (حرف ... args) {system.out.print (argS.getClass ()) ؛ system.out.println ("length" + args.length) ؛ } static void g (int ... args) {system.out.print (argS.getClass ()) ؛ system.out.println ("length" + args.length) ؛ } public static void main (string [] args) {f ('a') ؛ f () ؛ ز (1) ؛ ز () ؛ System.out.println ("int []" + new int [0] .getClass ()) ؛ }}هذه ميزة تم تقديمها في Java 5. إذا كان عدد المعلمات التي تريدها أن تتلقها غير مؤكد ، فيمكن أن تكون هذه الميزة مفيدة.
على سبيل المثال ، عندما تشارك عمليات IO ، تحتاج أساسًا إلى إغلاق دفقين على الأقل: الإدخال والمخرجات. أحب تغليف عملية إغلاق الدفق في الطريقة التالية ، بحيث يمكن إغلاق تدفقات متعددة في مكالمة واحدة فقط.
إغلاق الفراغ الثابت العام (قابلة للإغلاق ... closeAls) {for (قابلة للإغلاق قابلة للإغلاق: closeables) {if (closable! = null) {try {closable.close () ؛ } catch (تجاهل ioException) {}}}}هذا هو المكان الوحيد الذي أعتقد أن هذه الميزة مناسبة للاستخدام ، مع الميزات التالية:
هذه المعلمات لها نفس النوع ؛
عدد المعلمات غير مؤكد ، كل منها اختياري ؛
استخدامات هذه المعلمات هي نفسها ، على سبيل المثال ، يتم تنفيذ جميع ما ورد أعلاه.
لا يمكن وضع قائمة المعلمة الطول المتغيرة Java إلا في نهاية قائمة المعلمات الطريقة.
تنفيذ قائمة المعلمات الطول المتغيرة Java
يتم تمرير تنفيذ قائمة المعلمة الطول المتغيرة Java عبر المترجم لتغليف هذه المعلمات في صفيف.
على سبيل المثال ، توقيع الطريقة أعلاه هو في الواقع: إغلاق (قابلة للإغلاق [] الإغلاق) باطل.
خطوة على حفرة
هناك طريقة تسمى A و B في مكانين. في سبتمبر ، يجب إضافة المعلمة إلى A. عندما كان عقلي مجنونًا ، قررت استخدام قائمة معلمات طول متغيرة. شعرت أنه لا توجد حاجة لتغييره إلى ب ، لذلك تم دفن الحفرة.
في الآونة الأخيرة ، طلبنا من B إضافة معلمتين جديدتين هنا ، لذلك نستمر في إضافة معلمات إلى قائمة المعلمات بالطريقة. تختلف أنواع هذه المعلمات ، لذلك يتم الإعلان عن قائمة المعلمات ذات الطول المتغير كنوع كائن.
الحفرة الأولى هي أنه عند أخذ العناصر ذات المعلمات ذات الطول المتغير في هذه الطريقة ، لا تأخذ في الاعتبار أنه لا يتم تمرير بعض المعلمات ، ويتم تدمير الصفيف بشكل مباشر. شعرت على الفور أن قائمة المعلمات ذات الطول المتغير لم تكن جيدة ، لذلك لم أكن بحاجة إليها ، وقمت بتغييرها إلى معلمة ثابتة من الشكل.
بعد التعديل ، من الجيد اختباره في بيئة الاختبار. بعد استبدال عدة فئات في بيئة الإنتاج ، والنتيجة هي خطأ. لا يمكن العثور على الطريقة. يعتمد ذلك على توقيع الطريقة ، لكنه صفيف ، ولم يتم استبداله. انطلاقًا من رمز المصدر ، لا يلزم تغيير موقع المكالمة ، لذلك لم أتوقع استبداله ؛ نظرًا لأن بيئة الاختبار معبأة بالكامل ، فلن تكون هناك مشاكل.
يتم تحديد توقيع الطريقة في وقت التجميع. لا يبدو أن مستوى رمز المصدر يتطلب تعديلًا ، ولكن لا يعني أن الفئة المترجمة لا تحتاج إلى استبدالها.
في الواقع ، لقد سمعت قبل ذلك في هذه الحالة من الحزم غير المنتظمة ، بعد تغيير قيمة ثابتة في الكود المصدري ، فقط ملف الفئة الذي يحدد الثابت يتم استبداله ، ولا يتم إعادة تجميع واستبدال جميع ملفات الفئة التي تشير إلى هذا الثابت ، مما يؤدي إلى مشاكل لا يمكن تفسيرها. إنها في الأساس نفس مشكلة توقيع الطريقة.