سؤال

هل يوجد لدى أحد أي فكرة، لماذا طريقة مزيل في قائمة الملخص (وكذلك في 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top