array in java in hindi




Java में सभी 'स्थिर' वर्ग 'पद्धतियाँ स्थिर क्यों हैं? (6)

मैं जावा प्रलेखन के माध्यम से जा रहा था, और मुझे पता चला कि जावा में Arrays वर्ग के तरीके सभी स्थिर हैं। मुझे वास्तव में इसके पीछे का कारण समझ में नहीं आया कि उन्होंने इसे स्थिर क्यों बनाया।

उदाहरण के लिए, निम्न कोड OO दृष्टिकोण का उल्लंघन करता है, क्योंकि अगर मेरे पास एक प्रकार, 'X' है, तो उस पर कार्य करने वाली सभी विधियाँ इसके अंदर होनी चाहिए:

int[] a = {34, 23, 12};
Arrays.sort(a);

बेहतर होगा कि वे निम्नलिखित तरीके से लागू करें:

int[] a = {34, 23, 12};
a.sort();

क्या कोई मुझे इस पर थोड़ा समझा सकता है?


अच्छा अवलोकन। इस बात का भी ध्यान रखें कि हर सरणी को हल नहीं किया जा सकता है। केवल प्राथमिकताओं और ऑब्जेक्ट्स की सरणियाँ जो Comparable इंटरफ़ेस को लागू करती हैं, उन्हें क्रमबद्ध किया जा सकता है। तो एक सामान्य sort() विधि जो सभी सरणियों पर लागू होती है, संभव नहीं है। और इसलिए हमारे पास समर्थित प्रकारों में से प्रत्येक के लिए कई अतिभारित स्थिर विधियां हैं जो वास्तव में छांटने योग्य हैं।

अद्यतन करें:

@Holger सही ढंग से टिप्पणियों में बताते हैं कि अतिभारित स्थैतिक विधियों में से एक वास्तव में Arrays.sort(Object[]) लेकिन डॉक्स स्पष्ट रूप से राज्य:

सरणी में सभी तत्वों को Comparable इंटरफ़ेस को लागू करना होगा।

तो यह उन वस्तुओं के लिए काम नहीं करता है जो Comparable या इसके उप-भागों में से एक को लागू नहीं करते हैं।


एक सरणी एक वस्तु नहीं है जो राज्य को संग्रहीत करता है, सरणी के वास्तविक मूल्यों से परे। दूसरे शब्दों में, यह सिर्फ एक "डंबल कंटेनर" है। यह किसी भी व्यवहार को "नहीं" जानता है।

उपयोगिता वर्ग एक ऐसा वर्ग है जिसमें केवल public static विधियां हैं जो स्टेटलेस फ़ंक्शन हैं। सॉर्टिंग स्टेटलेस है क्योंकि उस पद्धति पर कॉल के बीच कुछ भी याद नहीं है। यह "स्टैंडअलोन" चलता है, जो भी वस्तु पास की जाती है, उसके फॉर्मूले को लागू करते हुए, जब तक कि वह वस्तु "क्रमबद्ध" है। एक Arrays वर्ग का दूसरा उदाहरण व्यवहार अलग नहीं होगा, इसलिए बस एक static उदाहरण है।

जैसा कि डेरियस ने बताया, छंटाई के विभिन्न तरीके हैं। तो आप MyArrays.betterSort(array) साथ-साथ Arrays.sort(array)

यदि आप सरणी "जानना" चाहते हैं, तो अपने स्वयं के सदस्यों को क्रमबद्ध करने के लिए कितना अच्छा है, तो आपके पास अपना एक सरणी वर्ग होना चाहिए जो एक सरणी का extends करता है।

लेकिन क्या होगा यदि आपके पास एक ऐसी स्थिति है जहां आप एक ही सरणी पर अलग-अलग समय पर अलग-अलग छंटनी चाहते थे? एक आकस्मिक उदाहरण, हो सकता है, लेकिन वास्तविक दुनिया के समान उदाहरण बहुत सारे हैं।

और अब आप जटिल हो रहे हैं। हो सकता है कि T का एक प्रकार, S प्रकार से भिन्न हो।

यह एक स्थिर उपयोगिता और Comparator<T> इंटरफ़ेस के साथ सरल है।


जावा में किसी सरणी के कार्यात्मक रूप से विस्तार करने का कोई तरीका नहीं है। सभी Object से विरासत में मिला है, लेकिन यह बहुत कम देता है। IMHO यह जावा की कमी है।

इसके बजाय, सरणियों के लिए कार्यक्षमता जोड़ने के लिए, स्थिर उपयोगिता विधियों को Array और Arrays जैसी कक्षाओं में जोड़ा जाता है। ये विधियाँ static क्योंकि वे उदाहरण विधियाँ नहीं हैं।


मेरे लिए यह सही समाधान है। मेरे पास एक सरणी है, और मेरे पास एक वर्ग है, Arrays, जो सरणी में डेटा पर काम करता है। उदाहरण के लिए, आप कुछ यादृच्छिक संख्याओं को पकड़ना चाहते हैं और आप कभी भी छाँटना नहीं चाहेंगे या कोई अन्य उपयोगिता पद्धति आपको व्यवहार में आएगी जो आप नहीं चाहते हैं। इसलिए कोड डिजाइन में डेटा को व्यवहार से अलग करना अच्छा है।

आप एकल जिम्मेदारी सिद्धांत के बारे में पढ़ सकते हैं।


स्टेटिक तरीके कभी-कभी उपयोगिता के उद्देश्य से उपयोग किए जाते हैं। तो Arrays सामान्य प्रयोजन सरणी संचालन के लिए उपयोगिता वर्ग है। इसी तरह, Collections भी यूटिल क्लास है, जहां यूटिलिटी मेथड दिए गए हैं।


Arrays वर्ग में ऐसी विधियाँ होती हैं जो राज्य से स्वतंत्र होती हैं, इसलिए उन्हें static होना चाहिए। यह अनिवार्य रूप से एक उपयोगिता वर्ग है।

हालांकि ओओपी सिद्धांत लागू नहीं होते हैं, वर्तमान तरीका स्पष्ट, संक्षिप्त और अधिक पठनीय है क्योंकि आपको बहुरूपता और विरासत के बारे में चिंता करने की आवश्यकता नहीं है। यह सब गुंजाइश कम कर देता है, जो अंततः संभावना को कम करता है कि आप कुछ पेंच करते हैं ।

अब, आप अपने आप से पूछ सकते हैं "मैं जावा में सरणी की कार्यक्षमता का विस्तार क्यों नहीं कर सकता?"। एक अच्छा जवाब यह है कि यह संभावित सुरक्षा छेद का परिचय देता है, जो सिस्टम कोड को तोड़ सकता है।






static