Java का AbstractList का रिमरेंज () विधि संरक्षित क्यों है?


98

क्या किसी के पास कोई विचार है, क्यों AbstractRist (और ArrayList में ) को हटा दें protected? यह एक बहुत अच्छी तरह से परिभाषित और उपयोगी ऑपरेशन जैसा दिखता है, लेकिन फिर भी, इसका उपयोग करने के लिए, हम सूची कार्यान्वयन को उप-वर्ग करने के लिए मजबूर हैं।

क्या कुछ छिपा हुआ तर्क है? मुझे बहुत अकथनीय लगता है।

जवाबों:


163

हां, क्योंकि यह नहीं है कि आप बाहरी कोड से कोई सीमा कैसे निकालते हैं। इसके बजाय, यह करें:

list.subList(start, end).clear();

यह वास्तव removeRangeमें पर्दे के पीछे कहता है ।


ओपी पूछता है कि सार्वजनिक एपीआई removeRangeका हिस्सा क्यों नहीं Listहै। कारण प्रभावी जावा 2 एड के आइटम 40 में वर्णित है, और मैं इसे यहां उद्धृत करता हूं:

अत्यधिक लंबी पैरामीटर सूचियों को छोटा करने के लिए तीन तकनीकें हैं। एक विधि को कई विधियों में विभाजित करना है, जिनमें से प्रत्येक को केवल मापदंडों के एक सबसेट की आवश्यकता होती है। यदि लापरवाही से काम लिया जाए, तो इससे बहुत अधिक विधियां हो सकती हैं, लेकिन यह रूढ़िवादिता को बढ़ाकर विधि की गिनती को कम करने में भी मदद कर सकता है । उदाहरण के लिए, java.util.Listइंटरफ़ेस पर विचार करें। यह एक तत्व के पहले या अंतिम सूचकांक को खोजने के लिए विधियाँ प्रदान नहीं करता है, जिसमें दोनों को तीन मापदंडों की आवश्यकता होगी। इसके बजाय यह subListविधि प्रदान करता है , जो दो पैरामीटर लेता है और एक सबलिस्ट का दृश्य देता है । इस पद्धति को indexOfया तो lastIndexOfतरीकों के साथ जोड़ा जा सकता है , जिनमें से प्रत्येक में वांछित कार्यक्षमता प्राप्त करने के लिए एक एकल पैरामीटर है। इसके अलावा,subListविधि को किसी भी विधि के साथ जोड़ा जा सकता है जो Listउदाहरण के तौर पर उपनलियों पर मनमानी गणना करने के लिए संचालित होती है । परिणामस्वरूप एपीआई में बहुत अधिक शक्ति-से-भार अनुपात है।

कोई यह तर्क दे removeRangeसकता है कि कई पैरामीटर नहीं हैं और इसलिए शायद इस उपचार के लिए कोई उम्मीदवार नहीं है, लेकिन यह देखते हुए कि इसके removeRangeमाध्यम से आह्वान करने का एक तरीका है subList, Listएक निरर्थक पद्धति के साथ इंटरफ़ेस को अव्यवस्थित करने का कोई कारण नहीं है ।


AbstractList.removeRange प्रलेखन का कहना है:

इस विधि को clearइस सूची और इसके उपलेस्ट पर ऑपरेशन द्वारा बुलाया जाता है । सूची कार्यान्वयन के आंतरिक लोगों का लाभ उठाने के लिए इस पद्धति को ओवरराइड करने से इस सूची और इसके उप-कलाकारों पर कार्रवाई के प्रदर्शन में काफी सुधार हो सकता हैclear

इसके अलावा, के OpenJDK के कार्यान्वयन को देखने AbstractList.clearऔर SubList.removeRange


9
ठीक है, यह उस तरह से किया जा सकता है, लेकिन क्यों ? अजीब लगता है। एकल तत्वों को सीधे सूची से हटाया जा सकता है, फिर कई तत्वों को क्यों नहीं?
पुलसका

1
@ जून: प्रभावी जावा का आइटम 40, दूसरा संस्करण इसके लिए तर्क का वर्णन करता है। यदि आपके पास पुस्तक नहीं है तो मैं संबंधित अनुभाग में पेस्ट करूँगा।
क्रिस जस्टर-यंग

21
+1 (प्रश्न का उत्तर)। हालांकि, सिर्फ इसलिए कि एक तर्क दिया जाता है इसका मतलब यह नहीं है कि यह समझ में आता है। पैरामीटर सूची को छोटा करने की प्रक्रिया एक एपीआई में उपलब्ध संचालन को समझने के लिए डेवलपर्स की क्षमता में बाधा डालती है, जो सीधे इस कारण से काम करती है कि पहले स्थान पर सूचियों को छोटा क्यों किया गया था।
सैम हैरवेल

3
तो जावा के लिए विशिष्ट। आइए इसे सबसे जटिल और कम से कम प्रभावी बनाएं।
टॉम ज़ातो -

2
साइड नोट के रूप में, क्या आपने नोटिस किया कि सूची के बहुत अंत तक फैले रेंज पर संस्करण का उपयोग करने पर अनावश्यक रूप से removeRangeकॉल करता है ? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/... 0 है, इसलिए पूरे arraycopy कोड एक एकल में डाल दिया गया है हो सकता है (के रूप में में किया ); अंतर यह है कि एक) arraycopy एक देशी कॉल है, उठाने एक ओवरहेड, ख) arraycopy करता है हमेशा पैरामीटर के लिए शुद्धता की जांच stackoverflow.com/questions/12594046/...arraycopyArrayListnumMovedifremove
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.