إذا وجدت أن هناك طريقة تعريف في واجهة:
السلسلة العامة [] getParameters () ؛
ثم يجب أن تنعكس بجدية. المصفوفة ليست قديمة فقط ، ولكن لدينا أسباب معقولة لتجنب التعرض. في هذه المقالة ، سأحاول تلخيص عيوب الصفيف في Java API. ابدأ بواحد من أكثر الأمثلة غير المتوقعة.
الصفيف يؤدي إلى ضعف الأداء
قد تعتقد أن استخدام المصفوفات هو الأسرع لأن الصفيف هو بنية البيانات الأساسية التي تنفذها معظم المجموعات. كيف يمكن استخدام مجموعة أرقام نقية أقل من استخدام كائن صفيف؟
لنبدأ بهذا الاستخدام الشائع للهالة المألوفة:
السلسلة العامة [] getNames () {return nameslist.toarray (سلسلة جديدة [nameslist.size ()]) ؛} تقوم هذه الطريقة بإنشاء بيانات متغيرة حيث يتم استخدام بيانات الحفاظ عليها الداخلية أبطأ (يرجى الاطلاع على شريط Green vs Orange في المخطط):
السلسلة العامة [] getNames () {return nameslist.toarray (سلسلة جديدة [0]) ؛} ومع ذلك ، إذا كانت الطريقة تُرجع قائمة ، فإن إنشاء نسخة دفاعية أسرع (شريط أحمر):
القائمة العامة <string> getNames () {return new ArrayList (nameslist) ؛} الفرق هو أن ArrayList يضع عنصر البيانات في كائن [] ، ويستخدم نوعًا من طريقة toarray ، وهو أمر أسرع بكثير من نوع الطريقة (الشريط الأزرق) لا يوجد نوع من الصفيف ، يتم تغليف التغليف في النوع العام للمترجم.
يعرض هذا الرمز معيارًا مرجعيًا لـ N = 5 على Java 7. ومع ذلك ، لن تتغير هذه الصورة كثيرًا. تم تحويلها إلى مجموعة من أجل استخدامها لفعل أي شيء ، ثم تحويل النتيجة إلى صفيف لإرسالها إلى طريقة واجهة أخرى ، وهكذا.
يستخدم قائمة ArtyList البسيطة بدلاً من صفيف لتحسين الأداء بايت.
باستخدام مجموعة ، يمكنك حتى أن تقرر إرجاع نسخة غير معدلة من القائمة الداخلية:
القائمة العامة <string> getNames () {return collections.unmodifiablelist (nameslist) ؛}سيتم تشغيل هذه العملية بسعر السوق الثابت ، لذلك فهو أسرع بكثير من أي طريقة أخرى (شريط أصفر). سيتغير عدم القدرة على تعديل التغيير عندما تتغير بياناتك الداخلية. في حالة حدوث التغيير ، فإن العميل يركض إلى مجموعة من العناصر المترتبة على ذلك. ، سيكون الأمر عالي الأداء اختيار الأشياء التي لا يمكن تنفيذها بواسطة المصفوفات.
يحدد الصفيف الهيكل وليس الواجهة
Java هي لغة موجهة إلى كائن. يتمثل المفهوم الأساسي في الكائنات في توفير بعض الطرق للوصول إلى بياناتهم وتشغيلها بدلاً من تشغيل مجال البيانات مباشرة.
نظرًا لأن Java قد تم دمجه ، فقد تم دمج الأنواع المحلية والصفوف في STYPLY COMPLES. من الوصول المباشر ، ليس لديك الكثير من الأشياء الأخرى التي يمكنك القيام بها في الصفيف.
String [] Array = {"foo" ، "bar"} ؛ println (Array) ؛ "،" بار "}) // -> خطأتختلف عن الصفيف ، حيث يوفر API العديد من الطرق المفيدة للوصول إلى العناصر. والحفاظ على مبدأ التنفيذ في نفس الوقت.
باستخدام البيانات ، يمكنك تحديد مكان الحفاظ على البيانات في الذاكرة.
الصفيف ليس نوعًا آمنًا
إذا كنت تعتمد على نوع الاختيار المترجم ، فاحرص على هزيمة الكود التالي.
الرقم [] عدد صحيح جديد [10] ؛
والسبب هو أن الصفيف "تعاوني". تغطية جميع النظريات ، وجميع النظريات ، يجب على كل مطور Java القراءة.
بسبب هذا السلوك ، تسمح واجهة نوع الصفيف المكشوف بنوع فرعي لإعلان نوع الصفيف ، والذي يسبب خللًا غريبًا في وقت التشغيل.
أوضح Bloch أيضًا أن الصفيف غير متوافق مع النوع العام.
كتلة Joshua ، Java الفعالة (الطبعة الثانية) ، المادة 29
لخص
إن بنية اللغة للطبقة السفلية من المصفوفة وسيتم استخدامها في التنفيذ ، لكن يجب ألا يفكروا في التعرض للصفوف الأخرى. .