لماذا يتم حماية طريقة Removerange () من Java AbstractList؟
-
21-09-2019 - |
سؤال
هل يوجد لدى أحد أي فكرة، لماذا طريقة مزيل في قائمة الملخص (وكذلك في ArrayList) هو protected
؟ يبدو الأمر وكأنه عملية محددة جيدًا ومفيدة ، ولكن لا يزال ، لاستخدامها ، نحن مجبرون على الفئة الفرعية لتنفيذ القائمة.
هل هناك بعض الأساس المنطقي الخفي؟ يبدو أنه لا يمكن تفسيره بالنسبة لي.
المحلول
نعم ، لأن هذه ليست الطريقة التي تزيل بها نطاقًا من الرمز الخارجي. بدلاً من ذلك ، افعل هذا:
list.subList(start, end).clear();
هذا في الواقع يدعو removeRange
خلف الكواليس.†
يسأل OP لماذا removeRange
ليس جزءًا من List
واجهة برمجة التطبيقات العامة. تم وصف السبب في البند 40 من Java 2nd Ed الفعال ، وأنا أقتبس منه هنا:
هناك ثلاث تقنيات لتقصير قوائم المعلمات الطويلة المفرطة. أحدهما هو تقسيم الطريقة إلى طرق متعددة ، يتطلب كل منها مجموعة فرعية فقط من المعلمات. إذا تم القيام به بلا مبالاة ، فقد يؤدي ذلك إلى العديد من الطرق ، ولكن يمكن أن يساعد أيضًا خفض تعتبر الطريقة عن طريق زيادة التعامد. على سبيل المثال ، فكر في
java.util.List
واجهه المستخدم. لا يوفر طرقًا للعثور على الفهرس الأول أو الأخير لعنصر في سبر فرعي ، وكلاهما يتطلب ثلاث معلمات. بدلا من ذلك يوفرsubList
الطريقة التي تأخذ معلمتين وترجع أ رأي من ساذجة. يمكن دمج هذه الطريقة معindexOf
أوlastIndexOf
الطرق ، كل منها لديه معلمة واحدة ، لإعطاء الوظيفة المطلوبة. وعلاوة على ذلك، فإنsubList
يمكن دمج الطريقة مع أي الطريقة التي تعمل على أList
مثيل لإجراء حسابات تعسفية على المحتملين الفرعيين. تحتوي واجهة برمجة التطبيقات الناتجة على نسبة عالية من القوة إلى الوزن.
يمكن للمرء أن يجادل ذلك removeRange
ليس لديها العديد من المعلمات ، وبالتالي فمن المحتمل ألا يكون مرشحًا لهذا العلاج ، ولكن بالنظر إلى أن هناك طريقة للاستدعاء removeRange
عبر ال subList
, ، لا يوجد سبب لتفكيك List
واجهة مع طريقة زائدة.
† ال AbstractList.removeRange
الوثائق تقول:
هذه الطريقة تسمى من قبل
clear
العملية في هذه القائمة وقواليها الفرعية. التغلب على هذه الطريقة للاستفادة من الداخلية لتنفيذ القائمة يمكن جوهريا تحسين أداءclear
العملية في هذه القائمة وقواليها الفرعية.
أيضًا ، انظر تطبيق OpenJDK لـ AbstractList.clear
و SubList.removeRange
.