हालांकि कुछ लोग "वैकल्पिक तरीकों" को कम कर सकते हैं, वे कई मामलों में अत्यधिक अलग-अलग इंटरफेस की तुलना में बेहतर शब्दार्थ प्रदान कर सकते हैं। अन्य बातों के अलावा, वे उन संभावनाओं के लिए अनुमति देते हैं जो एक वस्तु अपने जीवनकाल में क्षमताओं या विशेषताओं को प्राप्त कर सकती हैं, या यह कि किसी वस्तु (विशेष रूप से एक आवरण वस्तु) को यह पता नहीं हो सकता है कि इसका निर्माण कब किया गया है, इसकी सटीक क्षमताओं को रिपोर्ट करना चाहिए।
हालांकि मैं शायद ही जावा संग्रह कक्षाओं को अच्छे डिजाइन के पैरागॉन कहूंगा, मैं सुझाव दूंगा कि एक अच्छा संग्रह ढांचा अपनी नींव में बड़ी संख्या में वैकल्पिक तरीकों के साथ-साथ अपनी विशेषताओं और क्षमताओं के बारे में एक संग्रह पूछने के तरीकों के साथ शामिल होना चाहिए । इस तरह के डिजाइन से एक सिंगल रैपर क्लास को बड़ी मात्रा में विभिन्न प्रकार के संग्रह के साथ इस्तेमाल किया जा सकता है, जो गलती से अस्पष्ट क्षमताओं के बिना अंतर्निहित संग्रह के पास हो सकता है। यदि विधियां वैकल्पिक नहीं थीं, तो संग्रह के लिए समर्थन करने वाली सुविधाओं के हर संयोजन के लिए एक अलग आवरण वर्ग होना आवश्यक होगा, या कुछ आवरण कुछ स्थितियों में अनुपयोगी हो सकते हैं।
उदाहरण के लिए, यदि कोई संग्रह अंत में किसी आइटम को इंडेक्स द्वारा लिखने, या वस्तुओं को जोड़ने का समर्थन करता है, लेकिन बीच में आइटम डालने का समर्थन नहीं करता है, तो कोड इसे रैपर में इनकैप्सुलेट करना चाहता है जो उस पर किए गए सभी कार्यों को लॉग करेगा, इसके लिए एक संस्करण की आवश्यकता होगी लॉगिंग रैपर जो समर्थित क्षमताओं के सटीक संयोजन के लिए प्रदान करता है, या यदि कोई भी उपलब्ध नहीं था, तो एक रैपर का उपयोग करना होगा जो दोनों या तो अपेंड या राइट-इंडेक्स का समर्थन करता है, लेकिन दोनों का नहीं। यदि, हालांकि, एक एकीकृत संग्रह इंटरफ़ेस ने "वैकल्पिक" के रूप में सभी तीन विधियां प्रदान कीं, लेकिन फिर यह बताने के लिए कि वैकल्पिक विधियों में से कौन सी विधि प्रयोग करने योग्य होगी, तब एकल रैपर वर्ग संग्रह को संभाल सकता है जो किसी भी संयोजन को लागू कर सकता है। यह पूछे जाने पर कि यह किन विशेषताओं का समर्थन करता है, एक रैपर बस जो भी संक्षिप्त संग्रह का समर्थन करता है, उसे रिपोर्ट कर सकता है।
ध्यान दें कि "वैकल्पिक क्षमताओं" का अस्तित्व कुछ मामलों में एकत्र किए गए संग्रह को कुछ कार्यों को लागू करने की अनुमति देता है जो कि क्षमता से कहीं अधिक कुशल थे अगर कार्यान्वयन के अस्तित्व द्वारा परिभाषित किया गया था। उदाहरण के लिए, मान लें कि concatenate
दो अन्य में से एक समग्र संग्रह बनाने के लिए एक विधि का उपयोग किया गया था, जिसमें से पहला 1,000,000 तत्वों के साथ एक एरेलेलिस्ट के रूप में हुआ था और जिनमें से अंतिम एक बीस-तत्व संग्रह था जो केवल शुरुआत से पुनरावृत्त हो सकता था। यदि संकलित संग्रह 1,000,013 वां तत्व (इंडेक्स 1,000,012) के लिए पूछा गया था, तो वह ArrayList से पूछ सकता है कि इसमें कितने आइटम हैं (यानी 1,000,000), अनुरोधित सूचकांक (12 उपज) से घटाएं, दूसरे से बारह तत्वों को पढ़ें और छोड़ें संग्रह, और फिर अगले तत्व वापस।
ऐसी स्थिति में, भले ही समग्र संग्रह में अनुक्रमणिका द्वारा किसी वस्तु को वापस करने का एक तात्कालिक तरीका नहीं होगा, लेकिन 1,000,013 वीं वस्तु के लिए समग्र संग्रह पूछना अभी भी व्यक्तिगत रूप से 1,000,013 वस्तुओं को पढ़ने और सभी को अनदेखा करने की तुलना में बहुत तेज़ होगा, लेकिन अंतिम एक।